From cca7d78d25600b8b8ec37cf35815f80fc88df040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 28 May 2025 18:16:09 +0800 Subject: [PATCH] refactor(backend): put fetch into context It's a best practice to add HTTP API clients to the `context`. Standard Apollo GraphQL tutorial has an example: https://www.apollographql.com/docs/apollo-server/data/context#resolvers Also database drivers, loggers, message queues or process environment defined configuration should go into the `context`, just like HTTP-clients. --- backend/src/context/fetch.ts | 19 + backend/src/context/index.ts | 5 + backend/src/db/seed.ts | 2 + backend/src/graphql/resolvers/groups.spec.ts | 1 - .../src/graphql/resolvers/messages.spec.ts | 5 + backend/src/graphql/resolvers/users.spec.ts | 1 - .../graphql/resolvers/users/location.spec.ts | 8 +- .../src/graphql/resolvers/users/location.ts | 34 +- backend/test/fetchMock/berlinDe.ts | 255 ++++++ backend/test/fetchMock/berlinEn.ts | 254 ++++++ backend/test/fetchMock/berlinGermany.ts | 742 ++++++++++++++++ backend/test/fetchMock/empty.ts | 7 + backend/test/fetchMock/hamburg.ts | 661 ++++++++++++++ backend/test/fetchMock/hamburgNY.ts | 813 ++++++++++++++++++ backend/test/fetchMock/index.ts | 11 + backend/test/fetchMock/leipzig.ts | 653 ++++++++++++++ backend/test/fetchMock/mapboxResponses.ts | 32 + backend/test/fetchMock/paris.ts | 615 +++++++++++++ backend/test/fetchMock/welzheim.ts | 686 +++++++++++++++ backend/test/helpers.ts | 11 +- 20 files changed, 4781 insertions(+), 34 deletions(-) create mode 100644 backend/src/context/fetch.ts create mode 100644 backend/test/fetchMock/berlinDe.ts create mode 100644 backend/test/fetchMock/berlinEn.ts create mode 100644 backend/test/fetchMock/berlinGermany.ts create mode 100644 backend/test/fetchMock/empty.ts create mode 100644 backend/test/fetchMock/hamburg.ts create mode 100644 backend/test/fetchMock/hamburgNY.ts create mode 100644 backend/test/fetchMock/index.ts create mode 100644 backend/test/fetchMock/leipzig.ts create mode 100644 backend/test/fetchMock/mapboxResponses.ts create mode 100644 backend/test/fetchMock/paris.ts create mode 100644 backend/test/fetchMock/welzheim.ts diff --git a/backend/src/context/fetch.ts b/backend/src/context/fetch.ts new file mode 100644 index 000000000..697690213 --- /dev/null +++ b/backend/src/context/fetch.ts @@ -0,0 +1,19 @@ +import request from 'request' + +export const fetch = (url: string) => { + // eslint-disable-next-line promise/avoid-new + return new Promise((resolve, reject) => { + // eslint-disable-next-line promise/prefer-await-to-callbacks + request(url, function (error, response, body) { + if (error) { + reject(error) + } else { + const response = JSON.parse(body) // eslint-disable-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-argument + // console.log(url) + // console.log(JSON.stringify(response, null, 2)) + resolve(response) + } + }) + }) +} +export type Fetch = typeof fetch diff --git a/backend/src/context/index.ts b/backend/src/context/index.ts index e71050ab4..6e9611094 100644 --- a/backend/src/context/index.ts +++ b/backend/src/context/index.ts @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/no-unsafe-return */ import databaseContext from '@context/database' +import type { Fetch } from '@context/fetch' +import { fetch as defaultFetch } from '@context/fetch' import pubsubContext from '@context/pubsub' import CONFIG from '@src/config' import type { DecodedUser } from '@src/jwt/decode' @@ -17,6 +19,7 @@ export const getContext = pubsub?: ReturnType authenticatedUser: DecodedUser | null | undefined config: typeof CONFIG + fetch: Fetch }) => async (req: { headers: { authorization?: string } }) => { const { @@ -24,6 +27,7 @@ export const getContext = database = serverDatabase, pubsub = serverPubsub, config = CONFIG, + fetch = defaultFetch, } = opts ?? {} const { driver } = database const user = @@ -41,6 +45,7 @@ export const getContext = currentUserId: user ? user.id : null, }, config, + fetch, } return result } diff --git a/backend/src/db/seed.ts b/backend/src/db/seed.ts index d9db21b54..f73c54bc3 100644 --- a/backend/src/db/seed.ts +++ b/backend/src/db/seed.ts @@ -16,6 +16,7 @@ import { createPostMutation } from '@graphql/queries/createPostMutation' import { createRoomMutation } from '@graphql/queries/createRoomMutation' import { joinGroupMutation } from '@graphql/queries/joinGroupMutation' import { createApolloTestSetup } from '@root/test/helpers' +import { fetch as actualFetch } from '@src/context/fetch' import Factory from './factories' import { trophies, verification } from './seed/badges' @@ -38,6 +39,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] const context = () => ({ authenticatedUser, config: CONFIG, + fetch: actualFetch, }) const apolloSetup = createApolloTestSetup({ context }) const { mutate, server, database } = apolloSetup diff --git a/backend/src/graphql/resolvers/groups.spec.ts b/backend/src/graphql/resolvers/groups.spec.ts index 744503a9d..cc21680fd 100644 --- a/backend/src/graphql/resolvers/groups.spec.ts +++ b/backend/src/graphql/resolvers/groups.spec.ts @@ -15,7 +15,6 @@ import { updateGroupMutation } from '@graphql/queries/updateGroupMutation' import type { ApolloTestSetup } from '@root/test/helpers' import { createApolloTestSetup } from '@root/test/helpers' import type { Context } from '@src/context' -// import CONFIG from '@src/config' let user let noMemberUser diff --git a/backend/src/graphql/resolvers/messages.spec.ts b/backend/src/graphql/resolvers/messages.spec.ts index 88a610e64..8b340233d 100644 --- a/backend/src/graphql/resolvers/messages.spec.ts +++ b/backend/src/graphql/resolvers/messages.spec.ts @@ -40,6 +40,11 @@ beforeAll(async () => { beforeEach(async () => { await cleanDatabase() + const apolloSetup = createApolloTestSetup({ context }) + mutate = apolloSetup.mutate + query = apolloSetup.query + database = apolloSetup.database + server = apolloSetup.server }) afterAll(async () => { diff --git a/backend/src/graphql/resolvers/users.spec.ts b/backend/src/graphql/resolvers/users.spec.ts index e870c7cd6..cf06ef7ce 100644 --- a/backend/src/graphql/resolvers/users.spec.ts +++ b/backend/src/graphql/resolvers/users.spec.ts @@ -14,7 +14,6 @@ import type { ApolloTestSetup } from '@root/test/helpers' import { createApolloTestSetup } from '@root/test/helpers' import type { Context } from '@src/context' import type { DecodedUser } from '@src/jwt/decode' -// import CONFIG from '@src/config' const categoryIds = ['cat9'] let user diff --git a/backend/src/graphql/resolvers/users/location.spec.ts b/backend/src/graphql/resolvers/users/location.spec.ts index a8349c2e8..5eb92baae 100644 --- a/backend/src/graphql/resolvers/users/location.spec.ts +++ b/backend/src/graphql/resolvers/users/location.spec.ts @@ -8,15 +8,15 @@ import type { ApolloTestSetup } from '@root/test/helpers' import { createApolloTestSetup } from '@root/test/helpers' import type { Context } from '@src/context' +let mutate: ApolloTestSetup['mutate'] +let query: any // eslint-disable-line @typescript-eslint/no-explicit-any +let database: ApolloTestSetup['database'] +let server: ApolloTestSetup['server'] let variables let authenticatedUser: Context['user'] const context = () => ({ authenticatedUser, }) -let mutate: ApolloTestSetup['mutate'] -let query: any // eslint-disable-line @typescript-eslint/no-explicit-any -let database: ApolloTestSetup['database'] -let server: ApolloTestSetup['server'] const updateUserMutation = gql` mutation ($id: ID!, $name: String!, $locationName: String) { diff --git a/backend/src/graphql/resolvers/users/location.ts b/backend/src/graphql/resolvers/users/location.ts index e07ea4594..5d8925daa 100644 --- a/backend/src/graphql/resolvers/users/location.ts +++ b/backend/src/graphql/resolvers/users/location.ts @@ -6,25 +6,11 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable promise/avoid-new */ -/* eslint-disable promise/prefer-await-to-callbacks */ + import { UserInputError } from 'apollo-server' -import request from 'request' import type { Context } from '@src/context' -const fetch = (url) => { - return new Promise((resolve, reject) => { - request(url, function (error, response, body) { - if (error) { - reject(error) - } else { - resolve(JSON.parse(body)) - } - }) - }) -} - const locales = ['en', 'de', 'fr', 'nl', 'it', 'es', 'pt', 'pl', 'ru'] const createLocation = async (session, mapboxData) => { @@ -85,13 +71,12 @@ export const createOrUpdateLocations = async ( let locationId if (locationName !== null) { - const res: any = await fetch( - `https://api.mapbox.com/geocoding/v5/mapbox.places/${encodeURIComponent( - locationName, - )}.json?access_token=${ - context.config.MAPBOX_TOKEN - }&types=region,place,country,address&language=${locales.join(',')}`, - ) + const url = `https://api.mapbox.com/geocoding/v5/mapbox.places/${encodeURIComponent( + locationName, + )}.json?access_token=${ + context.config.MAPBOX_TOKEN + }&types=region,place,country,address&language=${locales.join(',')}` + const res: any = await context.fetch(url) if (!res?.features?.[0]) { throw new UserInputError('locationName is invalid') @@ -166,9 +151,8 @@ export const createOrUpdateLocations = async ( } export const queryLocations = async ({ place, lang }, context: Context) => { - const res: any = await fetch( - `https://api.mapbox.com/geocoding/v5/mapbox.places/${place}.json?access_token=${context.config.MAPBOX_TOKEN}&types=region,place,country&language=${lang}`, - ) + const url = `https://api.mapbox.com/geocoding/v5/mapbox.places/${place}.json?access_token=${context.config.MAPBOX_TOKEN}&types=region,place,country&language=${lang}` + const res: any = await context.fetch(url) // Return empty array if no location found or error occurred if (!res?.features) { return [] diff --git a/backend/test/fetchMock/berlinDe.ts b/backend/test/fetchMock/berlinDe.ts new file mode 100644 index 000000000..4ba38488b --- /dev/null +++ b/backend/test/fetchMock/berlinDe.ts @@ -0,0 +1,255 @@ +export const berlinDe = { + type: 'FeatureCollection', + query: ['berlin'], + features: [ + { + id: 'place.115770', + type: 'Feature', + place_type: ['region', 'place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBY1E2', + wikidata: 'Q64', + short_code: 'DE-BE', + }, + text_de: 'Berlin', + language_de: 'de', + place_name_de: 'Berlin, Deutschland', + text: 'Berlin', + language: 'de', + place_name: 'Berlin, Deutschland', + bbox: [13.08836, 52.338261, 13.760906, 52.675502], + center: [13.38886, 52.517037], + geometry: { + type: 'Point', + coordinates: [13.38886, 52.517037], + }, + context: [ + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_de: 'Deutschland', + language_de: 'de', + text: 'Deutschland', + language: 'de', + }, + ], + }, + { + id: 'place.25995500', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWXlvN0E', + wikidata: 'Q614184', + }, + text_de: 'Berlin', + language_de: 'de', + place_name_de: 'Berlin, Maryland, Vereinigte Staaten', + text: 'Berlin', + language: 'de', + place_name: 'Berlin, Maryland, Vereinigte Staaten', + bbox: [-75.364989, 38.141747, -75.087625, 38.4078], + center: [-75.219004, 38.324728], + geometry: { + type: 'Point', + coordinates: [-75.219004, 38.324728], + }, + context: [ + { + id: 'district.25396972', + mapbox_id: 'dXJuOm1ieHBsYzpBWU9HN0E', + wikidata: 'Q494072', + text_de: 'Worcester County', + language_de: 'de', + text: 'Worcester County', + language: 'de', + }, + { + id: 'region.124140', + mapbox_id: 'dXJuOm1ieHBsYzpBZVRz', + wikidata: 'Q1391', + short_code: 'US-MD', + text_de: 'Maryland', + language_de: 'de', + text: 'Maryland', + language: 'de', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text: 'Vereinigte Staaten', + language: 'de', + }, + ], + }, + { + id: 'place.25970924', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWXhJN0E', + wikidata: 'Q1086827', + }, + text_de: 'Berlin', + language_de: 'de', + place_name_de: 'Berlin, New Jersey, Vereinigte Staaten', + text: 'Berlin', + language: 'de', + place_name: 'Berlin, New Jersey, Vereinigte Staaten', + bbox: [-74.974491, 39.70904, -74.878605, 39.809363], + center: [-74.929456, 39.791432], + geometry: { + type: 'Point', + coordinates: [-74.929456, 39.791432], + }, + context: [ + { + id: 'district.3016428', + mapbox_id: 'dXJuOm1ieHBsYzpMZ2Jz', + wikidata: 'Q497810', + text_de: 'Camden County', + language_de: 'de', + text: 'Camden County', + language: 'de', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_de: 'New Jersey', + language_de: 'de', + text: 'New Jersey', + language: 'de', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text: 'Vereinigte Staaten', + language: 'de', + }, + ], + }, + { + id: 'place.26118380', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWTZJN0E', + wikidata: 'Q2219095', + }, + text_de: 'Berlin Heights', + language_de: 'de', + place_name_de: 'Berlin Heights, Ohio, Vereinigte Staaten', + text: 'Berlin Heights', + language: 'de', + place_name: 'Berlin Heights, Ohio, Vereinigte Staaten', + bbox: [-82.54353, 41.285345, -82.382139, 41.364821], + center: [-82.493433, 41.325154], + geometry: { + type: 'Point', + coordinates: [-82.493433, 41.325154], + }, + context: [ + { + id: 'district.7235308', + mapbox_id: 'dXJuOm1ieHBsYzpibWJz', + wikidata: 'Q111310', + text_de: 'Erie County', + language_de: 'de', + text: 'Erie County', + language: 'de', + }, + { + id: 'region.140524', + mapbox_id: 'dXJuOm1ieHBsYzpBaVRz', + wikidata: 'Q1397', + short_code: 'US-OH', + text_de: 'Ohio', + language_de: 'de', + text: 'Ohio', + language: 'de', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text: 'Vereinigte Staaten', + language: 'de', + }, + ], + }, + { + id: 'place.26044652', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWTFvN0E', + wikidata: 'Q524646', + }, + text_de: 'Berlin', + language_de: 'de', + place_name_de: 'Berlin, Massachusetts, Vereinigte Staaten', + text: 'Berlin', + language: 'de', + place_name: 'Berlin, Massachusetts, Vereinigte Staaten', + bbox: [-71.678766, 42.350413, -71.58015, 42.418232], + center: [-71.638302, 42.381333], + geometry: { + type: 'Point', + coordinates: [-71.638302, 42.381333], + }, + context: [ + { + id: 'district.25405164', + mapbox_id: 'dXJuOm1ieHBsYzpBWU9tN0E', + wikidata: 'Q54093', + text_de: 'Worcester County', + language_de: 'de', + text: 'Worcester County', + language: 'de', + }, + { + id: 'region.353516', + mapbox_id: 'dXJuOm1ieHBsYzpCV1Rz', + wikidata: 'Q771', + short_code: 'US-MA', + text_de: 'Massachusetts', + language_de: 'de', + text: 'Massachusetts', + language: 'de', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text: 'Vereinigte Staaten', + language: 'de', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/berlinEn.ts b/backend/test/fetchMock/berlinEn.ts new file mode 100644 index 000000000..10712fbb5 --- /dev/null +++ b/backend/test/fetchMock/berlinEn.ts @@ -0,0 +1,254 @@ +export const berlinEn = { + type: 'FeatureCollection', + query: ['berlin'], + features: [ + { + id: 'place.115770', + type: 'Feature', + place_type: ['region', 'place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBY1E2', + wikidata: 'Q64', + short_code: 'DE-BE', + }, + text_en: 'Berlin', + language_en: 'en', + place_name_en: 'Berlin, Germany', + text: 'Berlin', + language: 'en', + place_name: 'Berlin, Germany', + bbox: [13.08836, 52.338261, 13.760906, 52.675502], + center: [13.38886, 52.517037], + geometry: { + type: 'Point', + coordinates: [13.38886, 52.517037], + }, + context: [ + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + }, + ], + }, + { + id: 'place.25995500', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWXlvN0E', + wikidata: 'Q614184', + }, + text_en: 'Berlin', + language_en: 'en', + place_name_en: 'Berlin, Maryland, United States', + text: 'Berlin', + language: 'en', + place_name: 'Berlin, Maryland, United States', + bbox: [-75.364989, 38.141747, -75.087625, 38.4078], + center: [-75.219004, 38.324728], + geometry: { + type: 'Point', + coordinates: [-75.219004, 38.324728], + }, + context: [ + { + id: 'district.25396972', + mapbox_id: 'dXJuOm1ieHBsYzpBWU9HN0E', + wikidata: 'Q494072', + text_en: 'Worcester County', + language_en: 'en', + text: 'Worcester County', + language: 'en', + }, + { + id: 'region.124140', + mapbox_id: 'dXJuOm1ieHBsYzpBZVRz', + wikidata: 'Q1391', + short_code: 'US-MD', + text_en: 'Maryland', + language_en: 'en', + text: 'Maryland', + language: 'en', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + }, + ], + }, + { + id: 'place.25970924', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWXhJN0E', + wikidata: 'Q1086827', + }, + text_en: 'Berlin', + language_en: 'en', + place_name_en: 'Berlin, New Jersey, United States', + text: 'Berlin', + language: 'en', + place_name: 'Berlin, New Jersey, United States', + bbox: [-74.974491, 39.70904, -74.878605, 39.809363], + center: [-74.929456, 39.791432], + geometry: { + type: 'Point', + coordinates: [-74.929456, 39.791432], + }, + context: [ + { + id: 'district.3016428', + mapbox_id: 'dXJuOm1ieHBsYzpMZ2Jz', + wikidata: 'Q497810', + text_en: 'Camden County', + language_en: 'en', + text: 'Camden County', + language: 'en', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_en: 'New Jersey', + language_en: 'en', + text: 'New Jersey', + language: 'en', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + }, + ], + }, + { + id: 'place.26036460', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWTFJN0E', + }, + text_en: 'Berlin', + language_en: 'en', + place_name_en: 'Berlin, Connecticut, United States', + text: 'Berlin', + language: 'en', + place_name: 'Berlin, Connecticut, United States', + bbox: [-72.840244, 41.554195, -72.712381, 41.652706], + center: [-72.73954, 41.628325], + geometry: { + type: 'Point', + coordinates: [-72.73954, 41.628325], + }, + context: [ + { + id: 'district.10020588', + mapbox_id: 'dXJuOm1ieHBsYzptT2Jz', + wikidata: 'Q54236', + text_en: 'Hartford County', + language_en: 'en', + text: 'Hartford County', + language: 'en', + }, + { + id: 'region.361708', + mapbox_id: 'dXJuOm1ieHBsYzpCWVRz', + wikidata: 'Q779', + short_code: 'US-CT', + text_en: 'Connecticut', + language_en: 'en', + text: 'Connecticut', + language: 'en', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + }, + ], + }, + { + id: 'place.26118380', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBWTZJN0E', + wikidata: 'Q2219095', + }, + text_en: 'Berlin Heights', + language_en: 'en', + place_name_en: 'Berlin Heights, Ohio, United States', + text: 'Berlin Heights', + language: 'en', + place_name: 'Berlin Heights, Ohio, United States', + bbox: [-82.54353, 41.285345, -82.382139, 41.364821], + center: [-82.493433, 41.325154], + geometry: { + type: 'Point', + coordinates: [-82.493433, 41.325154], + }, + context: [ + { + id: 'district.7235308', + mapbox_id: 'dXJuOm1ieHBsYzpibWJz', + wikidata: 'Q111310', + text_en: 'Erie County', + language_en: 'en', + text: 'Erie County', + language: 'en', + }, + { + id: 'region.140524', + mapbox_id: 'dXJuOm1ieHBsYzpBaVRz', + wikidata: 'Q1397', + short_code: 'US-OH', + text_en: 'Ohio', + language_en: 'en', + text: 'Ohio', + language: 'en', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/berlinGermany.ts b/backend/test/fetchMock/berlinGermany.ts new file mode 100644 index 000000000..09e01f30e --- /dev/null +++ b/backend/test/fetchMock/berlinGermany.ts @@ -0,0 +1,742 @@ +export const berlinGermany = { + type: 'FeatureCollection', + query: ['berlin', 'germany'], + features: [ + { + id: 'place.115770', + type: 'Feature', + place_type: ['region', 'place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBY1E2', + wikidata: 'Q64', + short_code: 'DE-BE', + }, + text_en: 'Berlin', + language_en: 'en', + place_name_en: 'Berlin, Germany', + text: 'Berlin', + language: 'en', + place_name: 'Berlin, Germany', + text_de: 'Berlin', + language_de: 'de', + place_name_de: 'Berlin, Deutschland', + text_fr: 'Berlin', + language_fr: 'fr', + place_name_fr: 'Berlin, Allemagne', + text_nl: 'Berlijn', + language_nl: 'nl', + place_name_nl: 'Berlijn, Duitsland', + text_it: 'Berlino', + language_it: 'it', + place_name_it: 'Berlino, Germania', + text_es: 'Berlín', + language_es: 'es', + place_name_es: 'Berlín, Alemania', + text_pt: 'Berlim', + language_pt: 'pt', + place_name_pt: 'Berlim, Alemanha', + text_pl: 'Berlin', + language_pl: 'pl', + place_name_pl: 'Berlin, Niemcy', + text_ru: 'Берлин', + language_ru: 'ru', + place_name_ru: 'Берлин, Германия', + bbox: [13.08836, 52.338261, 13.760906, 52.675502], + center: [13.38886, 52.517037], + geometry: { + type: 'Point', + coordinates: [13.38886, 52.517037], + }, + context: [ + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.1882189389165686', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6Y2EyZjMxNmMtZjBhMy00ZmYwLWEwODgtZDYxMzg4ZmUwNTVh', + }, + text_en: 'Berlin', + place_name_en: 'Berlin, 24848 Klein Bennebek, Germany', + text: 'Berlin', + place_name: 'Berlin, 24848 Klein Bennebek, Germany', + text_de: 'Berlin', + place_name_de: 'Berlin, 24848 Klein Bennebek, Deutschland', + text_fr: 'Berlin', + place_name_fr: 'Berlin, 24848 Klein Bennebek, Allemagne', + text_nl: 'Berlin', + place_name_nl: 'Berlin, 24848 Klein Bennebek, Duitsland', + text_it: 'Berlin', + place_name_it: 'Berlin, 24848 Klein Bennebek, Germania', + text_es: 'Berlin', + place_name_es: 'Berlin, 24848 Klein Bennebek, Alemania', + text_pt: 'Berlin', + place_name_pt: 'Berlin, 24848 Klein Bennebek, Alemanha', + text_pl: 'Berlin', + place_name_pl: 'Berlin, 24848 Klein Bennebek, Niemcy', + text_ru: 'Berlin', + place_name_ru: 'Berlin, 24848 Клайн-Беннебек, Германия', + center: [9.422626, 54.404248], + geometry: { + type: 'Point', + coordinates: [9.422626, 54.404248], + }, + context: [ + { + id: 'postcode.13266490', + mapbox_id: 'dXJuOm1ieHBsYzp5bTQ2', + text_en: '24848', + text: '24848', + text_de: '24848', + text_fr: '24848', + text_nl: '24848', + text_it: '24848', + text_es: '24848', + text_pt: '24848', + text_pl: '24848', + text_ru: '24848', + }, + { + id: 'place.40798266', + mapbox_id: 'dXJuOm1ieHBsYzpBbTZJT2c', + wikidata: 'Q556639', + text_en: 'Klein Bennebek', + language_en: 'en', + text: 'Klein Bennebek', + language: 'en', + text_de: 'Klein Bennebek', + language_de: 'de', + text_fr: 'Klein Bennebek', + language_fr: 'fr', + text_nl: 'Klein Bennebek', + language_nl: 'nl', + text_it: 'Klein Bennebek', + language_it: 'it', + text_es: 'Klein Bennebek', + language_es: 'es', + text_pt: 'Klein Bennebek', + language_pt: 'pt', + text_pl: 'Klein Bennebek', + language_pl: 'pl', + text_ru: 'Клайн-Беннебек', + language_ru: 'ru', + }, + { + id: 'district.1885754', + mapbox_id: 'dXJuOm1ieHBsYzpITVk2', + wikidata: 'Q2941', + text_en: 'Distrito de Schleswig-Flensburg', + language_en: 'es', + text: 'Distrito de Schleswig-Flensburg', + language: 'es', + text_de: 'Kreis Schleswig-Flensburg', + language_de: 'de', + text_fr: 'Kreis Schleswig-Flensburg', + text_nl: 'Kreis Schleswig-Flensburg', + text_it: 'Kreis Schleswig-Flensburg', + text_es: 'Distrito de Schleswig-Flensburg', + language_es: 'es', + text_pt: 'Distrito de Schleswig-Flensburg', + language_pt: 'es', + text_pl: 'Powiat Schleswig-Flensburg', + language_pl: 'pl', + text_ru: 'Шлезвиг-Фленсбург', + language_ru: 'ru', + }, + { + id: 'region.17466', + mapbox_id: 'dXJuOm1ieHBsYzpSRG8', + wikidata: 'Q1194', + short_code: 'DE-SH', + text_en: 'Schleswig-Holstein', + language_en: 'en', + text: 'Schleswig-Holstein', + language: 'en', + text_de: 'Schleswig-Holstein', + language_de: 'de', + text_fr: 'Schleswig-Holstein', + language_fr: 'fr', + text_nl: 'Sleeswijk-Holstein', + language_nl: 'nl', + text_it: 'Schleswig-Holstein', + language_it: 'it', + text_es: 'Schleswig-Holstein', + language_es: 'es', + text_pt: 'Schleswig-Holstein', + language_pt: 'pt', + text_pl: 'Szlezwik-Holsztyn', + language_pl: 'pl', + text_ru: 'Шлезвиг-Гольштейн', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7517935193989996', + type: 'Feature', + place_type: ['address'], + relevance: 0.958333, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6ZTY0MTBlYTgtNzBhZS00MmViLTk0ZWItNThlM2U4YmUzNDcz', + }, + text_en: 'Barlin', + place_name_en: 'Barlin, 17159 Dargun, Germany', + text: 'Barlin', + place_name: 'Barlin, 17159 Dargun, Germany', + text_de: 'Barlin', + place_name_de: 'Barlin, 17159 Dargun, Deutschland', + text_fr: 'Barlin', + place_name_fr: 'Barlin, 17159 Dargun, Allemagne', + text_nl: 'Barlin', + place_name_nl: 'Barlin, 17159 Dargun, Duitsland', + text_it: 'Barlin', + place_name_it: 'Barlin, 17159 Dargun, Germania', + text_es: 'Barlin', + place_name_es: 'Barlin, 17159 Dargun, Alemania', + text_pt: 'Barlin', + place_name_pt: 'Barlin, 17159 Dargun, Alemanha', + text_pl: 'Barlin', + place_name_pl: 'Barlin, 17159 Dargun, Niemcy', + text_ru: 'Barlin', + place_name_ru: 'Barlin, 17159 Даргун, Германия', + center: [12.883232, 53.922631], + geometry: { + type: 'Point', + coordinates: [12.883232, 53.922631], + }, + context: [ + { + id: 'postcode.8072762', + mapbox_id: 'dXJuOm1ieHBsYzpleTQ2', + text_en: '17159', + text: '17159', + text_de: '17159', + text_fr: '17159', + text_nl: '17159', + text_it: '17159', + text_es: '17159', + text_pt: '17159', + text_pl: '17159', + text_ru: '17159', + }, + { + id: 'locality.19302970', + mapbox_id: 'dXJuOm1ieHBsYzpBU2FLT2c', + text_en: 'Barlin', + language_en: 'de', + text: 'Barlin', + language: 'de', + text_de: 'Barlin', + language_de: 'de', + text_fr: 'Barlin', + text_nl: 'Barlin', + text_it: 'Barlin', + text_es: 'Barlin', + text_pt: 'Barlin', + text_pl: 'Barlin', + text_ru: 'Barlin', + }, + { + id: 'place.14256186', + mapbox_id: 'dXJuOm1ieHBsYzoyWWc2', + wikidata: 'Q50959', + text_en: 'Dargun', + language_en: 'en', + text: 'Dargun', + language: 'en', + text_de: 'Dargun', + language_de: 'de', + text_fr: 'Dargun', + language_fr: 'fr', + text_nl: 'Dargun', + language_nl: 'nl', + text_it: 'Dargun', + language_it: 'it', + text_es: 'Dargun', + language_es: 'es', + text_pt: 'Dargun', + language_pt: 'pt', + text_pl: 'Dargun', + language_pl: 'pl', + text_ru: 'Даргун', + language_ru: 'ru', + }, + { + id: 'district.1214010', + mapbox_id: 'dXJuOm1ieHBsYzpFb1k2', + wikidata: 'Q2902', + text_en: 'Mecklenburgische Seenplatte District', + language_en: 'en', + text: 'Mecklenburgische Seenplatte District', + language: 'en', + text_de: 'Kreis Mecklenburgische Seenplatte', + language_de: 'de', + text_fr: 'Plateau des lacs mecklembourgeois', + language_fr: 'fr', + text_nl: 'Landkreis Mecklenburgische Seenplatte', + language_nl: 'nl', + text_it: 'circondario della Terra dei Laghi del Meclemburgo', + language_it: 'it', + text_es: 'Lagos de Mecklemburgo', + language_es: 'es', + text_pt: 'Lagos de Mecklemburgo', + language_pt: 'es', + text_pl: 'Landkreis Mecklenburgische Seenplatte', + language_pl: 'pl', + text_ru: 'Мекленбург-Зеенплате', + language_ru: 'ru', + }, + { + id: 'region.25658', + mapbox_id: 'dXJuOm1ieHBsYzpaRG8', + wikidata: 'Q1196', + short_code: 'DE-MV', + text_en: 'Mecklenburg-Western Pomerania', + language_en: 'en', + text: 'Mecklenburg-Western Pomerania', + language: 'en', + text_de: 'Mecklenburg-Vorpommern', + language_de: 'de', + text_fr: 'Mecklembourg-Poméranie-Occidentale', + language_fr: 'fr', + text_nl: 'Mecklenburg-Voor-Pommeren', + language_nl: 'nl', + text_it: 'Meclemburgo-Pomerania Anteriore', + language_it: 'it', + text_es: 'Mecklemburgo-Pomerania Occidental', + language_es: 'es', + text_pt: 'Mecklemburgo-Pomerânia Ocidental', + language_pt: 'pt', + text_pl: 'Meklemburgia-Pomorze Przednie', + language_pl: 'pl', + text_ru: 'Мекленбург — Передняя Померания', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.4752874377841546', + type: 'Feature', + place_type: ['address'], + relevance: 0.958333, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6ODljMjJmMWItNTUyMy00ODIwLWFiNDYtNjU0YTRiZTc4NzJm', + }, + text_en: 'Ferliner Straße', + place_name_en: 'Ferliner Straße, 84332 Hebertsfelden, Germany', + text: 'Ferliner Straße', + place_name: 'Ferliner Straße, 84332 Hebertsfelden, Germany', + text_de: 'Ferliner Straße', + place_name_de: 'Ferliner Straße, 84332 Hebertsfelden, Deutschland', + text_fr: 'Ferliner Straße', + place_name_fr: 'Ferliner Straße, 84332 Hebertsfelden, Allemagne', + text_nl: 'Ferliner Straße', + place_name_nl: 'Ferliner Straße, 84332 Hebertsfelden, Duitsland', + text_it: 'Ferliner Straße', + place_name_it: 'Ferliner Straße, 84332 Hebertsfelden, Germania', + text_es: 'Ferliner Straße', + place_name_es: 'Ferliner Straße, 84332 Hebertsfelden, Alemania', + text_pt: 'Ferliner Straße', + place_name_pt: 'Ferliner Straße, 84332 Hebertsfelden, Alemanha', + text_pl: 'Ferliner Straße', + place_name_pl: 'Ferliner Straße, 84332 Hebertsfelden, Niemcy', + text_ru: 'Ferliner Straße', + place_name_ru: 'Ferliner Straße, 84332 Хебертсфельден, Германия', + center: [12.81704, 48.43586], + geometry: { + type: 'Point', + coordinates: [12.81704, 48.43586], + }, + context: [ + { + id: 'postcode.51138106', + mapbox_id: 'dXJuOm1ieHBsYzpBd3hPT2c', + text_en: '84332', + text: '84332', + text_de: '84332', + text_fr: '84332', + text_nl: '84332', + text_it: '84332', + text_es: '84332', + text_pt: '84332', + text_pl: '84332', + text_ru: '84332', + }, + { + id: 'locality.267905594', + mapbox_id: 'dXJuOm1ieHBsYzpEL2ZxT2c', + text_en: 'Prienbach', + language_en: 'de', + text: 'Prienbach', + language: 'de', + text_de: 'Prienbach', + language_de: 'de', + text_fr: 'Prienbach', + text_nl: 'Prienbach', + text_it: 'Prienbach', + text_es: 'Prienbach', + text_pt: 'Prienbach', + text_pl: 'Prienbach', + text_ru: 'Prienbach', + }, + { + id: 'place.31664186', + mapbox_id: 'dXJuOm1ieHBsYzpBZU1vT2c', + wikidata: 'Q553780', + text_en: 'Hebertsfelden', + language_en: 'en', + text: 'Hebertsfelden', + language: 'en', + text_de: 'Hebertsfelden', + language_de: 'de', + text_fr: 'Hebertsfelden', + language_fr: 'fr', + text_nl: 'Hebertsfelden', + language_nl: 'nl', + text_it: 'Hebertsfelden', + language_it: 'it', + text_es: 'Hebertsfelden', + language_es: 'es', + text_pt: 'Hebertsfelden', + language_pt: 'pt', + text_pl: 'Hebertsfelden', + language_pl: 'pl', + text_ru: 'Хебертсфельден', + language_ru: 'ru', + }, + { + id: 'district.1795642', + mapbox_id: 'dXJuOm1ieHBsYzpHMlk2', + wikidata: 'Q10477', + text_en: 'arrondissement de Rottal-Inn', + language_en: 'fr', + text: 'arrondissement de Rottal-Inn', + language: 'fr', + text_de: 'Kreis Rottal-Inn', + language_de: 'de', + text_fr: 'arrondissement de Rottal-Inn', + language_fr: 'fr', + text_nl: 'arrondissement de Rottal-Inn', + language_nl: 'fr', + text_it: 'Districtul Rottal-Inn', + language_it: 'ro', + text_es: 'arrondissement de Rottal-Inn', + language_es: 'fr', + text_pt: 'Kreis Rottal-Inn', + text_pl: 'Powiat Rottal-Inn', + language_pl: 'pl', + text_ru: 'Ротталь-Инн', + language_ru: 'ru', + }, + { + id: 'region.123962', + mapbox_id: 'dXJuOm1ieHBsYzpBZVE2', + wikidata: 'Q980', + short_code: 'DE-BY', + text_en: 'Bavaria', + language_en: 'en', + text: 'Bavaria', + language: 'en', + text_de: 'Bayern', + language_de: 'de', + text_fr: 'Bavière', + language_fr: 'fr', + text_nl: 'Beieren', + language_nl: 'nl', + text_it: 'Baviera', + language_it: 'it', + text_es: 'Baviera', + language_es: 'es', + text_pt: 'Baviera', + language_pt: 'pt', + text_pl: 'Bawaria', + language_pl: 'pl', + text_ru: 'Бавария', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7246440478456020', + type: 'Feature', + place_type: ['address'], + relevance: 0.958333, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6MTUyNjZlZjItOTIxZC00OTc0LWIyZmMtOWM2NTQyOWE3MDEx', + }, + text_en: 'Erlin', + place_name_en: 'Erlin, 74545 Michelfeld, Germany', + text: 'Erlin', + place_name: 'Erlin, 74545 Michelfeld, Germany', + text_de: 'Erlin', + place_name_de: 'Erlin, 74545 Michelfeld, Deutschland', + text_fr: 'Erlin', + place_name_fr: 'Erlin, 74545 Michelfeld, Allemagne', + text_nl: 'Erlin', + place_name_nl: 'Erlin, 74545 Michelfeld, Duitsland', + text_it: 'Erlin', + place_name_it: 'Erlin, 74545 Michelfeld, Germania', + text_es: 'Erlin', + place_name_es: 'Erlin, 74545 Michelfeld, Alemania', + text_pt: 'Erlin', + place_name_pt: 'Erlin, 74545 Michelfeld, Alemanha', + text_pl: 'Erlin', + place_name_pl: 'Erlin, 74545 Michelfeld, Niemcy', + text_ru: 'Erlin', + place_name_ru: 'Erlin, 74545 Михельфельд, Германия', + center: [9.658099, 49.105636], + geometry: { + type: 'Point', + coordinates: [9.658099, 49.105636], + }, + context: [ + { + id: 'postcode.43716154', + mapbox_id: 'dXJuOm1ieHBsYzpBcHNPT2c', + text_en: '74545', + text: '74545', + text_de: '74545', + text_fr: '74545', + text_nl: '74545', + text_it: '74545', + text_es: '74545', + text_pt: '74545', + text_pl: '74545', + text_ru: '74545', + }, + { + id: 'locality.166046266', + mapbox_id: 'dXJuOm1ieHBsYzpDZVdxT2c', + text_en: 'Kiesberg', + language_en: 'de', + text: 'Kiesberg', + language: 'de', + text_de: 'Kiesberg', + language_de: 'de', + text_fr: 'Kiesberg', + text_nl: 'Kiesberg', + text_it: 'Kiesberg', + text_es: 'Kiesberg', + text_pt: 'Kiesberg', + text_pl: 'Kiesberg', + text_ru: 'Kiesberg', + }, + { + id: 'place.50980922', + mapbox_id: 'dXJuOm1ieHBsYzpBd25vT2c', + wikidata: 'Q81048', + text_en: 'Michelfeld', + language_en: 'en', + text: 'Michelfeld', + language: 'en', + text_de: 'Michelfeld', + language_de: 'de', + text_fr: 'Michelfeld', + language_fr: 'fr', + text_nl: 'Michelfeld', + language_nl: 'nl', + text_it: 'Michelfeld', + language_it: 'it', + text_es: 'Michelfeld', + language_es: 'es', + text_pt: 'Michelfeld', + language_pt: 'pt', + text_pl: 'Michelfeld', + language_pl: 'pl', + text_ru: 'Михельфельд', + language_ru: 'ru', + }, + { + id: 'district.1902138', + mapbox_id: 'dXJuOm1ieHBsYzpIUVk2', + wikidata: 'Q8520', + text_en: 'Landkreis Schwäbisch Hall', + language_en: 'en', + text: 'Landkreis Schwäbisch Hall', + language: 'en', + text_de: 'Kreis Schwäbisch Hall', + language_de: 'de', + text_fr: 'arrondissement de Schwäbisch Hall', + language_fr: 'fr', + text_nl: 'arrondissement de Schwäbisch Hall', + language_nl: 'fr', + text_it: 'circondario di Schwäbisch Hall', + language_it: 'it', + text_es: 'arrondissement de Schwäbisch Hall', + language_es: 'fr', + text_pt: 'circondario di Schwäbisch Hall', + language_pt: 'it', + text_pl: 'Districtul Schwäbisch Hall', + language_pl: 'ro', + text_ru: 'Швебиш-Халль', + language_ru: 'ru', + }, + { + id: 'region.132154', + mapbox_id: 'dXJuOm1ieHBsYzpBZ1E2', + wikidata: 'Q985', + short_code: 'DE-BW', + text_en: 'Baden-Württemberg', + language_en: 'en', + text: 'Baden-Württemberg', + language: 'en', + text_de: 'Baden-Württemberg', + language_de: 'de', + text_fr: 'Bade-Wurtemberg', + language_fr: 'fr', + text_nl: 'Baden-Württemberg', + language_nl: 'nl', + text_it: 'Baden-Württemberg', + language_it: 'it', + text_es: 'Baden-Wurtemberg', + language_es: 'es', + text_pt: 'Baden-Württemberg', + language_pt: 'pt', + text_pl: 'Badenia-Wirtembergia', + language_pl: 'pl', + text_ru: 'Баден-Вюртемберг', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/empty.ts b/backend/test/fetchMock/empty.ts new file mode 100644 index 000000000..9ae6b3afa --- /dev/null +++ b/backend/test/fetchMock/empty.ts @@ -0,0 +1,7 @@ +export const empty = { + type: 'FeatureCollection', + query: ['gbhtsd4sdha'], + features: [], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/hamburg.ts b/backend/test/fetchMock/hamburg.ts new file mode 100644 index 000000000..65f742926 --- /dev/null +++ b/backend/test/fetchMock/hamburg.ts @@ -0,0 +1,661 @@ +export const hamburg = { + type: 'FeatureCollection', + query: ['hamburg', 'germany'], + features: [ + { + id: 'place.9274', + type: 'Feature', + place_type: ['region', 'place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpKRG8', + wikidata: 'Q1055', + short_code: 'DE-HH', + }, + text_en: 'Hamburg', + language_en: 'en', + place_name_en: 'Hamburg, Germany', + text: 'Hamburg', + language: 'en', + place_name: 'Hamburg, Germany', + text_de: 'Hamburg', + language_de: 'de', + place_name_de: 'Hamburg, Deutschland', + text_fr: 'Hambourg', + language_fr: 'fr', + place_name_fr: 'Hambourg, Allemagne', + text_nl: 'Hamburg', + language_nl: 'nl', + place_name_nl: 'Hamburg, Duitsland', + text_it: 'Amburgo', + language_it: 'it', + place_name_it: 'Amburgo, Germania', + text_es: 'Hamburgo', + language_es: 'es', + place_name_es: 'Hamburgo, Alemania', + text_pt: 'Hamburgo', + language_pt: 'pt', + place_name_pt: 'Hamburgo, Alemanha', + text_pl: 'Hamburg', + language_pl: 'pl', + place_name_pl: 'Hamburg, Niemcy', + text_ru: 'Гамбург', + language_ru: 'ru', + place_name_ru: 'Гамбург, Германия', + bbox: [8.345049, 53.395085, 10.325247, 54.010088], + center: [10.000654, 53.550341], + geometry: { + type: 'Point', + coordinates: [10.000654, 53.550341], + }, + context: [ + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.2262168808051568', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6MGM5NzRmMmYtNTA0Yi00MDk1LWJjNGItNTA3NmRhY2Y4YzQ5', + }, + text_en: 'Hamburg', + place_name_en: 'Hamburg, 38889 Oberharz am Brocken, Germany', + text: 'Hamburg', + place_name: 'Hamburg, 38889 Oberharz am Brocken, Germany', + text_de: 'Hamburg', + place_name_de: 'Hamburg, 38889 Oberharz am Brocken, Deutschland', + text_fr: 'Hamburg', + place_name_fr: 'Hamburg, 38889 Oberharz am Brocken, Allemagne', + text_nl: 'Hamburg', + place_name_nl: 'Hamburg, 38889 Oberharz am Brocken, Duitsland', + text_it: 'Hamburg', + place_name_it: 'Hamburg, 38889 Oberharz am Brocken, Germania', + text_es: 'Hamburg', + place_name_es: 'Hamburg, 38889 Oberharz am Brocken, Alemania', + text_pt: 'Hamburg', + place_name_pt: 'Hamburg, 38889 Oberharz am Brocken, Alemanha', + text_pl: 'Hamburg', + place_name_pl: 'Hamburg, 38889 Oberharz am Brocken, Niemcy', + text_ru: 'Hamburg', + place_name_ru: 'Hamburg, 38889 Оберхарц-ам-Броккен, Германия', + center: [10.872935, 51.752737], + geometry: { + type: 'Point', + coordinates: [10.872935, 51.752737], + }, + context: [ + { + id: 'postcode.23424570', + mapbox_id: 'dXJuOm1ieHBsYzpBV1Z1T2c', + text_en: '38889', + text: '38889', + text_de: '38889', + text_fr: '38889', + text_nl: '38889', + text_it: '38889', + text_es: '38889', + text_pt: '38889', + text_pl: '38889', + text_ru: '38889', + }, + { + id: 'locality.232909370', + mapbox_id: 'dXJuOm1ieHBsYzpEZUhxT2c', + wikidata: 'Q1982027', + text_en: 'Neuwerk', + language_en: 'en', + text: 'Neuwerk', + language: 'en', + text_de: 'Neuwerk', + language_de: 'de', + text_fr: 'Neuwerk', + language_fr: 'fr', + text_nl: 'Neuwerk', + language_nl: 'nl', + text_it: 'Neuwerk', + language_it: 'it', + text_es: 'Neuwerk', + language_es: 'es', + text_pt: 'Neuwerk', + language_pt: 'pt', + text_pl: 'Neuwerk', + language_pl: 'pl', + text_ru: 'Neuwerk', + }, + { + id: 'place.57780282', + mapbox_id: 'dXJuOm1ieHBsYzpBM0dvT2c', + wikidata: 'Q703001', + text_en: 'Oberharz am Brocken', + language_en: 'en', + text: 'Oberharz am Brocken', + language: 'en', + text_de: 'Oberharz am Brocken', + language_de: 'de', + text_fr: 'Oberharz am Brocken', + language_fr: 'fr', + text_nl: 'Oberharz am Brocken', + language_nl: 'nl', + text_it: 'Oberharz am Brocken', + language_it: 'it', + text_es: 'Oberharz am Brocken', + language_es: 'es', + text_pt: 'Oberharz am Brocken', + language_pt: 'pt', + text_pl: 'Oberharz am Brocken', + language_pl: 'pl', + text_ru: 'Оберхарц-ам-Броккен', + language_ru: 'ru', + }, + { + id: 'district.755258', + mapbox_id: 'dXJuOm1ieHBsYzpDNFk2', + wikidata: 'Q6087', + text_en: 'Harz District', + language_en: 'en', + text: 'Harz District', + language: 'en', + text_de: 'Kreis Harz', + language_de: 'de', + text_fr: 'Arrondissement de Harz', + language_fr: 'fr', + text_nl: 'Landkreis Harz', + language_nl: 'nl', + text_it: 'circondario dello Harz', + language_it: 'it', + text_es: 'Distrito de Harz', + language_es: 'es', + text_pt: 'Distrito de Harz', + language_pt: 'es', + text_pl: 'Landkreis Harz', + language_pl: 'pl', + text_ru: 'Гарц', + language_ru: 'ru', + }, + { + id: 'region.91194', + mapbox_id: 'dXJuOm1ieHBsYzpBV1E2', + wikidata: 'Q1206', + short_code: 'DE-ST', + text_en: 'Saxony-Anhalt', + language_en: 'en', + text: 'Saxony-Anhalt', + language: 'en', + text_de: 'Sachsen-Anhalt', + language_de: 'de', + text_fr: 'Saxe-Anhalt', + language_fr: 'fr', + text_nl: 'Saksen-Anhalt', + language_nl: 'nl', + text_it: 'Sassonia-Anhalt', + language_it: 'it', + text_es: 'Sajonia-Anhalt', + language_es: 'es', + text_pt: 'Saxónia-Anhalt', + language_pt: 'pt', + text_pl: 'Saksonia-Anhalt', + language_pl: 'pl', + text_ru: 'Саксония-Анхальт', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.8952604554248206', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6NGNmMGExNGUtMjExMy00Yzk1LTllYjQtYTllOTRmNDIxZmEz', + }, + text_en: 'Hamburg', + place_name_en: 'Hamburg, 54608 Bleialf, Germany', + text: 'Hamburg', + place_name: 'Hamburg, 54608 Bleialf, Germany', + text_de: 'Hamburg', + place_name_de: 'Hamburg, 54608 Bleialf, Deutschland', + text_fr: 'Hamburg', + place_name_fr: 'Hamburg, 54608 Bleialf, Allemagne', + text_nl: 'Hamburg', + place_name_nl: 'Hamburg, 54608 Bleialf, Duitsland', + text_it: 'Hamburg', + place_name_it: 'Hamburg, 54608 Bleialf, Germania', + text_es: 'Hamburg', + place_name_es: 'Hamburg, 54608 Bleialf, Alemania', + text_pt: 'Hamburg', + place_name_pt: 'Hamburg, 54608 Bleialf, Alemanha', + text_pl: 'Hamburg', + place_name_pl: 'Hamburg, 54608 Bleialf, Niemcy', + text_ru: 'Hamburg', + place_name_ru: 'Hamburg, 54608 Блайальф, Германия', + center: [6.286919, 50.231471], + geometry: { + type: 'Point', + coordinates: [6.286919, 50.231471], + }, + context: [ + { + id: 'postcode.30887482', + mapbox_id: 'dXJuOm1ieHBsYzpBZGRPT2c', + text_en: '54608', + text: '54608', + text_de: '54608', + text_fr: '54608', + text_nl: '54608', + text_it: '54608', + text_es: '54608', + text_pt: '54608', + text_pl: '54608', + text_ru: '54608', + }, + { + id: 'place.8742970', + mapbox_id: 'dXJuOm1ieHBsYzpoV2c2', + wikidata: 'Q553361', + text_en: 'Bleialf', + language_en: 'en', + text: 'Bleialf', + language: 'en', + text_de: 'Bleialf', + language_de: 'de', + text_fr: 'Bleialf', + language_fr: 'fr', + text_nl: 'Bleialf', + language_nl: 'nl', + text_it: 'Bleialf', + language_it: 'it', + text_es: 'Bleialf', + language_es: 'es', + text_pt: 'Bleialf', + language_pt: 'pt', + text_pl: 'Bleialf', + language_pl: 'pl', + text_ru: 'Блайальф', + language_ru: 'ru', + }, + { + id: 'district.2434618', + mapbox_id: 'dXJuOm1ieHBsYzpKU1k2', + wikidata: 'Q8580', + text_en: 'Eifelkreis Bitburg-Prüm', + language_en: 'en', + text: 'Eifelkreis Bitburg-Prüm', + language: 'en', + text_de: 'Eifelkreis Bitburg-Prüm', + language_de: 'de', + text_fr: 'Eifel-Bitburg-Prüm', + language_fr: 'fr', + text_nl: 'Eifelkreis Bitburg-Prüm', + language_nl: 'nl', + text_it: 'Eifelkreis Bitburg-Prüm', + language_it: 'it', + text_es: 'Eifel-Bitburg-Prüm', + language_es: 'es', + text_pt: 'Bitburg-Prüm', + language_pt: 'pt', + text_pl: 'Eifelkreis Bitburg-Prüm', + language_pl: 'pl', + text_ru: 'Айфель-Битбург-Прюм', + language_ru: 'ru', + }, + { + id: 'region.58426', + mapbox_id: 'dXJuOm1ieHBsYzo1RG8', + wikidata: 'Q1200', + short_code: 'DE-RP', + text_en: 'Rhineland-Palatinate', + language_en: 'en', + text: 'Rhineland-Palatinate', + language: 'en', + text_de: 'Rheinland-Pfalz', + language_de: 'de', + text_fr: 'Rhénanie-Palatinat', + language_fr: 'fr', + text_nl: 'Rijnland-Palts', + language_nl: 'nl', + text_it: 'Renania-Palatinato', + language_it: 'it', + text_es: 'Renania-Palatinado', + language_es: 'es', + text_pt: 'Renânia-Palatinado', + language_pt: 'pt', + text_pl: 'Nadrenia-Palatynat', + language_pl: 'pl', + text_ru: 'Рейнланд-Пфальц', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'place.35727418', + type: 'Feature', + place_type: ['place'], + relevance: 0.964286, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBaUVvT2c', + wikidata: 'Q7040', + }, + text_en: 'Homburg', + language_en: 'en', + place_name_en: 'Homburg, Saarpfalz-Kreis, Saarland, Germany', + text: 'Homburg', + language: 'en', + place_name: 'Homburg, Saarpfalz-Kreis, Saarland, Germany', + text_de: 'Homburg', + language_de: 'de', + place_name_de: 'Homburg, Saarpfalz-Kreis, Saarland, Deutschland', + text_fr: 'Hombourg', + language_fr: 'fr', + place_name_fr: 'Hombourg, circondario del Saarpfalz, Sarre, Allemagne', + text_nl: 'Homburg', + language_nl: 'nl', + place_name_nl: 'Homburg, Saarpfalz-Kreis, Saarland, Duitsland', + text_it: 'Homburg', + language_it: 'it', + place_name_it: 'Homburg, circondario del Saarpfalz, Saarland, Germania', + text_es: 'Homburg', + language_es: 'es', + place_name_es: 'Homburg, Saarpfalz-Kreis, Sarre, Alemania', + text_pt: 'Homburg', + language_pt: 'pt', + place_name_pt: 'Homburg, circondario del Saarpfalz, Sarre, Alemanha', + text_pl: 'Homburg', + language_pl: 'pl', + place_name_pl: 'Homburg, Powiat Saarpfalz, Saara, Niemcy', + text_ru: 'Хомбург', + language_ru: 'ru', + place_name_ru: 'Хомбург, Саарпфальц, Саар, Германия', + bbox: [7.274109, 49.247602, 7.404584, 49.386381], + center: [7.340504, 49.321426], + geometry: { + type: 'Point', + coordinates: [7.340504, 49.321426], + }, + context: [ + { + id: 'district.2704954', + mapbox_id: 'dXJuOm1ieHBsYzpLVVk2', + wikidata: 'Q6793', + text_en: 'Saarpfalz-Kreis', + language_en: 'de', + text: 'Saarpfalz-Kreis', + language: 'de', + text_de: 'Saarpfalz-Kreis', + language_de: 'de', + text_fr: 'circondario del Saarpfalz', + language_fr: 'it', + text_nl: 'Saarpfalz-Kreis', + text_it: 'circondario del Saarpfalz', + language_it: 'it', + text_es: 'Saarpfalz-Kreis', + text_pt: 'circondario del Saarpfalz', + language_pt: 'it', + text_pl: 'Powiat Saarpfalz', + language_pl: 'pl', + text_ru: 'Саарпфальц', + language_ru: 'ru', + }, + { + id: 'region.66618', + mapbox_id: 'dXJuOm1ieHBsYzpBUVE2', + wikidata: 'Q1201', + short_code: 'DE-SL', + text_en: 'Saarland', + language_en: 'en', + text: 'Saarland', + language: 'en', + text_de: 'Saarland', + language_de: 'de', + text_fr: 'Sarre', + language_fr: 'fr', + text_nl: 'Saarland', + language_nl: 'nl', + text_it: 'Saarland', + language_it: 'it', + text_es: 'Sarre', + language_es: 'es', + text_pt: 'Sarre', + language_pt: 'pt', + text_pl: 'Saara', + language_pl: 'pl', + text_ru: 'Саар', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'place.30623802', + type: 'Feature', + place_type: ['place'], + relevance: 0.964286, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBZE5JT2c', + wikidata: 'Q503226', + }, + text_en: 'Harburg', + language_en: 'en', + place_name_en: 'Harburg, arrondissement de Danube-Ries, Bavaria, Germany', + text: 'Harburg', + language: 'en', + place_name: 'Harburg, arrondissement de Danube-Ries, Bavaria, Germany', + text_de: 'Harburg', + language_de: 'de', + place_name_de: 'Harburg, Kreis Donau-Ries, Bayern, Deutschland', + text_fr: 'Harbourg', + language_fr: 'fr', + place_name_fr: 'Harbourg, arrondissement de Danube-Ries, Bavière, Allemagne', + text_nl: 'Harburg', + language_nl: 'nl', + place_name_nl: 'Harburg, arrondissement de Danube-Ries, Beieren, Duitsland', + text_it: 'Harburg', + language_it: 'it', + place_name_it: 'Harburg, Circondario del Danubio-Ries, Baviera, Germania', + text_es: 'Harburg', + language_es: 'es', + place_name_es: 'Harburg, arrondissement de Danube-Ries, Baviera, Alemania', + text_pt: 'Harburg', + language_pt: 'pt', + place_name_pt: 'Harburg, Circondario del Danubio-Ries, Baviera, Alemanha', + text_pl: 'Harburg', + language_pl: 'pl', + place_name_pl: 'Harburg, Landkreis Donau-Ries, Bawaria, Niemcy', + text_ru: 'Харбург', + language_ru: 'ru', + place_name_ru: 'Харбург, Донау-Рис, Бавария, Германия', + bbox: [10.617754, 48.726549, 10.770464, 48.83036], + center: [10.688789, 48.787212], + geometry: { + type: 'Point', + coordinates: [10.688789, 48.787212], + }, + context: [ + { + id: 'district.419386', + mapbox_id: 'dXJuOm1ieHBsYzpCbVk2', + wikidata: 'Q10418', + text_en: 'arrondissement de Danube-Ries', + language_en: 'fr', + text: 'arrondissement de Danube-Ries', + language: 'fr', + text_de: 'Kreis Donau-Ries', + language_de: 'de', + text_fr: 'arrondissement de Danube-Ries', + language_fr: 'fr', + text_nl: 'arrondissement de Danube-Ries', + language_nl: 'fr', + text_it: 'Circondario del Danubio-Ries', + language_it: 'it', + text_es: 'arrondissement de Danube-Ries', + language_es: 'fr', + text_pt: 'Circondario del Danubio-Ries', + language_pt: 'it', + text_pl: 'Landkreis Donau-Ries', + language_pl: 'pl', + text_ru: 'Донау-Рис', + language_ru: 'ru', + }, + { + id: 'region.123962', + mapbox_id: 'dXJuOm1ieHBsYzpBZVE2', + wikidata: 'Q980', + short_code: 'DE-BY', + text_en: 'Bavaria', + language_en: 'en', + text: 'Bavaria', + language: 'en', + text_de: 'Bayern', + language_de: 'de', + text_fr: 'Bavière', + language_fr: 'fr', + text_nl: 'Beieren', + language_nl: 'nl', + text_it: 'Baviera', + language_it: 'it', + text_es: 'Baviera', + language_es: 'es', + text_pt: 'Baviera', + language_pt: 'pt', + text_pl: 'Bawaria', + language_pl: 'pl', + text_ru: 'Бавария', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/hamburgNY.ts b/backend/test/fetchMock/hamburgNY.ts new file mode 100644 index 000000000..8f920c99c --- /dev/null +++ b/backend/test/fetchMock/hamburgNY.ts @@ -0,0 +1,813 @@ +export const hamburgNY = { + type: 'FeatureCollection', + query: ['hamburg', 'new', 'jersey'], + features: [ + { + id: 'place.138242284', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpDRDFvN0E', + wikidata: 'Q1082931', + }, + text_en: 'Hamburg', + language_en: 'en', + place_name_en: 'Hamburg, New Jersey, United States', + text: 'Hamburg', + language: 'en', + place_name: 'Hamburg, New Jersey, United States', + text_de: 'Hamburg', + language_de: 'de', + place_name_de: 'Hamburg, New Jersey, Vereinigte Staaten', + text_fr: 'Hamburg', + language_fr: 'fr', + place_name_fr: 'Hamburg, New Jersey, États-Unis', + text_nl: 'Hamburg', + language_nl: 'nl', + place_name_nl: 'Hamburg, New Jersey, Verenigde Staten van Amerika', + text_it: 'Hamburg', + language_it: 'it', + place_name_it: "Hamburg, New Jersey, Stati Uniti d'America", + text_es: 'Hamburg', + language_es: 'es', + place_name_es: 'Hamburg, Nueva Jersey, Estados Unidos', + text_pt: 'Hamburg', + language_pt: 'pt', + place_name_pt: 'Hamburg, Nova Jérsia, Estados Unidos', + text_pl: 'Hamburg', + language_pl: 'nl', + place_name_pl: 'Hamburg, New Jersey, Stany Zjednoczone', + text_ru: 'Хамбург', + language_ru: 'kk', + place_name_ru: 'Хамбург, Нью-Джерси, США', + bbox: [-74.632296, 41.101134, -74.510997, 41.194008], + center: [-74.576227, 41.153431], + geometry: { + type: 'Point', + coordinates: [-74.576227, 41.153431], + }, + context: [ + { + id: 'district.22456044', + mapbox_id: 'dXJuOm1ieHBsYzpBVmFtN0E', + wikidata: 'Q495998', + text_en: 'Sussex County', + language_en: 'en', + text: 'Sussex County', + language: 'en', + text_de: 'Sussex County', + language_de: 'de', + text_fr: 'comté de Sussex', + language_fr: 'fr', + text_nl: 'Sussex County', + language_nl: 'nl', + text_it: 'contea di Sussex', + language_it: 'it', + text_es: 'Condado de Sussex', + language_es: 'es', + text_pt: 'Condado de Sussex', + language_pt: 'pt', + text_pl: 'Hrabstwo Sussex', + language_pl: 'pl', + text_ru: 'Сассекс', + language_ru: 'ru', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_en: 'New Jersey', + language_en: 'en', + text: 'New Jersey', + language: 'en', + text_de: 'New Jersey', + language_de: 'de', + text_fr: 'New Jersey', + language_fr: 'fr', + text_nl: 'New Jersey', + language_nl: 'nl', + text_it: 'New Jersey', + language_it: 'it', + text_es: 'Nueva Jersey', + language_es: 'es', + text_pt: 'Nova Jérsia', + language_pt: 'pt', + text_pl: 'New Jersey', + language_pl: 'pl', + text_ru: 'Нью-Джерси', + language_ru: 'ru', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text_fr: 'États-Unis', + language_fr: 'fr', + text_nl: 'Verenigde Staten van Amerika', + language_nl: 'nl', + text_it: "Stati Uniti d'America", + language_it: 'it', + text_es: 'Estados Unidos', + language_es: 'es', + text_pt: 'Estados Unidos', + language_pt: 'pt', + text_pl: 'Stany Zjednoczone', + language_pl: 'pl', + text_ru: 'США', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.4892302912777302', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + 'override:postcode': '', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6YTVmNjA1ZDItOGJhYS00MWRlLWE0MmUtYzYzYThjY2JlYzE2', + }, + text_en: 'Hamburg Turnpike', + place_name_en: 'Hamburg Turnpike, Stockholm, New Jersey 07460, United States', + text: 'Hamburg Turnpike', + place_name: 'Hamburg Turnpike, Stockholm, New Jersey 07460, United States', + text_de: 'Hamburg Turnpike', + place_name_de: 'Hamburg Turnpike, Stockholm, New Jersey 07460, Vereinigte Staaten', + text_fr: 'Hamburg Turnpike', + place_name_fr: 'Hamburg Turnpike, Stockholm, New Jersey 07460, États-Unis', + text_nl: 'Hamburg Turnpike', + place_name_nl: 'Hamburg Turnpike, Stockholm, New Jersey 07460, Verenigde Staten van Amerika', + text_it: 'Hamburg Turnpike', + place_name_it: "Hamburg Turnpike, Stockholm, New Jersey 07460, Stati Uniti d'America", + text_es: 'Hamburg Turnpike', + place_name_es: 'Hamburg Turnpike, Stockholm, Nueva Jersey 07460, Estados Unidos', + text_pt: 'Hamburg Turnpike', + place_name_pt: 'Hamburg Turnpike, Stockholm, Nova Jérsia 07460, Estados Unidos', + text_pl: 'Hamburg Turnpike', + place_name_pl: 'Hamburg Turnpike, Stockholm, New Jersey 07460, Stany Zjednoczone', + text_ru: 'Hamburg Turnpike', + place_name_ru: 'Hamburg Turnpike, Stockholm, Нью-Джерси 07460, США', + center: [-74.52295, 41.11971], + geometry: { + type: 'Point', + coordinates: [-74.52295, 41.11971], + }, + context: [ + { + id: 'postcode.20008684', + mapbox_id: 'dXJuOm1ieHBsYzpBVEZPN0E', + text_en: '07460', + text: '07460', + text_de: '07460', + text_fr: '07460', + text_nl: '07460', + text_it: '07460', + text_es: '07460', + text_pt: '07460', + text_pl: '07460', + text_ru: '07460', + }, + { + id: 'locality.237284076', + mapbox_id: 'dXJuOm1ieHBsYzpEaVNxN0E', + text_en: 'Hardyston Township', + language_en: 'en', + text: 'Hardyston Township', + language: 'en', + text_de: 'Hardyston Township', + language_de: 'en', + text_fr: 'Hardyston Township', + language_fr: 'en', + text_nl: 'Hardyston Township', + language_nl: 'en', + text_it: 'Hardyston Township', + language_it: 'en', + text_es: 'Hardyston Township', + language_es: 'en', + text_pt: 'Hardyston Township', + text_pl: 'Hardyston Township', + language_pl: 'en', + text_ru: 'Hardyston Township', + }, + { + id: 'place.315435244', + mapbox_id: 'dXJuOm1ieHBsYzpFczBvN0E', + wikidata: 'Q7617988', + text_en: 'Stockholm', + language_en: 'en', + text: 'Stockholm', + language: 'en', + text_de: 'Stockholm', + language_de: 'en', + text_fr: 'Stockholm', + language_fr: 'fr', + text_nl: 'Stockholm', + language_nl: 'fr', + text_it: 'Stockholm', + language_it: 'fr', + text_es: 'Stockholm', + language_es: 'fr', + text_pt: 'Stockholm', + text_pl: 'Stockholm', + language_pl: 'en', + text_ru: 'Stockholm', + }, + { + id: 'district.22456044', + mapbox_id: 'dXJuOm1ieHBsYzpBVmFtN0E', + wikidata: 'Q495998', + text_en: 'Sussex County', + language_en: 'en', + text: 'Sussex County', + language: 'en', + text_de: 'Sussex County', + language_de: 'de', + text_fr: 'comté de Sussex', + language_fr: 'fr', + text_nl: 'Sussex County', + language_nl: 'nl', + text_it: 'contea di Sussex', + language_it: 'it', + text_es: 'Condado de Sussex', + language_es: 'es', + text_pt: 'Condado de Sussex', + language_pt: 'pt', + text_pl: 'Hrabstwo Sussex', + language_pl: 'pl', + text_ru: 'Сассекс', + language_ru: 'ru', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_en: 'New Jersey', + language_en: 'en', + text: 'New Jersey', + language: 'en', + text_de: 'New Jersey', + language_de: 'de', + text_fr: 'New Jersey', + language_fr: 'fr', + text_nl: 'New Jersey', + language_nl: 'nl', + text_it: 'New Jersey', + language_it: 'it', + text_es: 'Nueva Jersey', + language_es: 'es', + text_pt: 'Nova Jérsia', + language_pt: 'pt', + text_pl: 'New Jersey', + language_pl: 'pl', + text_ru: 'Нью-Джерси', + language_ru: 'ru', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text_fr: 'États-Unis', + language_fr: 'fr', + text_nl: 'Verenigde Staten van Amerika', + language_nl: 'nl', + text_it: "Stati Uniti d'America", + language_it: 'it', + text_es: 'Estados Unidos', + language_es: 'es', + text_pt: 'Estados Unidos', + language_pt: 'pt', + text_pl: 'Stany Zjednoczone', + language_pl: 'pl', + text_ru: 'США', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.5578007523305814', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6YTY5NzVmZjAtMWI1MC00ZTZlLTlkNTctZTIzYWQ3N2Y5NGU5', + }, + text_en: 'Hamburg Pike', + place_name_en: 'Hamburg Pike, Hamburg, New Jersey 07419, United States', + text: 'Hamburg Pike', + place_name: 'Hamburg Pike, Hamburg, New Jersey 07419, United States', + text_de: 'Hamburg Pike', + place_name_de: 'Hamburg Pike, Hamburg, New Jersey 07419, Vereinigte Staaten', + text_fr: 'Hamburg Pike', + place_name_fr: 'Hamburg Pike, Hamburg, New Jersey 07419, États-Unis', + text_nl: 'Hamburg Pike', + place_name_nl: 'Hamburg Pike, Hamburg, New Jersey 07419, Verenigde Staten van Amerika', + text_it: 'Hamburg Pike', + place_name_it: "Hamburg Pike, Hamburg, New Jersey 07419, Stati Uniti d'America", + text_es: 'Hamburg Pike', + place_name_es: 'Hamburg Pike, Hamburg, Nueva Jersey 07419, Estados Unidos', + text_pt: 'Hamburg Pike', + place_name_pt: 'Hamburg Pike, Hamburg, Nova Jérsia 07419, Estados Unidos', + text_pl: 'Hamburg Pike', + place_name_pl: 'Hamburg Pike, Hamburg, New Jersey 07419, Stany Zjednoczone', + text_ru: 'Hamburg Pike', + place_name_ru: 'Hamburg Pike, Хамбург, Нью-Джерси 07419, США', + center: [-74.541928, 41.125463], + geometry: { + type: 'Point', + coordinates: [-74.541928, 41.125463], + }, + context: [ + { + id: 'postcode.19820268', + mapbox_id: 'dXJuOm1ieHBsYzpBUzV1N0E', + text_en: '07419', + text: '07419', + text_de: '07419', + text_fr: '07419', + text_nl: '07419', + text_it: '07419', + text_es: '07419', + text_pt: '07419', + text_pl: '07419', + text_ru: '07419', + }, + { + id: 'locality.237284076', + mapbox_id: 'dXJuOm1ieHBsYzpEaVNxN0E', + text_en: 'Hardyston Township', + language_en: 'en', + text: 'Hardyston Township', + language: 'en', + text_de: 'Hardyston Township', + language_de: 'en', + text_fr: 'Hardyston Township', + language_fr: 'en', + text_nl: 'Hardyston Township', + language_nl: 'en', + text_it: 'Hardyston Township', + language_it: 'en', + text_es: 'Hardyston Township', + language_es: 'en', + text_pt: 'Hardyston Township', + text_pl: 'Hardyston Township', + language_pl: 'en', + text_ru: 'Hardyston Township', + }, + { + id: 'place.138242284', + mapbox_id: 'dXJuOm1ieHBsYzpDRDFvN0E', + wikidata: 'Q1082931', + text_en: 'Hamburg', + language_en: 'en', + text: 'Hamburg', + language: 'en', + text_de: 'Hamburg', + language_de: 'de', + text_fr: 'Hamburg', + language_fr: 'fr', + text_nl: 'Hamburg', + language_nl: 'nl', + text_it: 'Hamburg', + language_it: 'it', + text_es: 'Hamburg', + language_es: 'es', + text_pt: 'Hamburg', + language_pt: 'pt', + text_pl: 'Hamburg', + language_pl: 'nl', + text_ru: 'Хамбург', + language_ru: 'kk', + }, + { + id: 'district.22456044', + mapbox_id: 'dXJuOm1ieHBsYzpBVmFtN0E', + wikidata: 'Q495998', + text_en: 'Sussex County', + language_en: 'en', + text: 'Sussex County', + language: 'en', + text_de: 'Sussex County', + language_de: 'de', + text_fr: 'comté de Sussex', + language_fr: 'fr', + text_nl: 'Sussex County', + language_nl: 'nl', + text_it: 'contea di Sussex', + language_it: 'it', + text_es: 'Condado de Sussex', + language_es: 'es', + text_pt: 'Condado de Sussex', + language_pt: 'pt', + text_pl: 'Hrabstwo Sussex', + language_pl: 'pl', + text_ru: 'Сассекс', + language_ru: 'ru', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_en: 'New Jersey', + language_en: 'en', + text: 'New Jersey', + language: 'en', + text_de: 'New Jersey', + language_de: 'de', + text_fr: 'New Jersey', + language_fr: 'fr', + text_nl: 'New Jersey', + language_nl: 'nl', + text_it: 'New Jersey', + language_it: 'it', + text_es: 'Nueva Jersey', + language_es: 'es', + text_pt: 'Nova Jérsia', + language_pt: 'pt', + text_pl: 'New Jersey', + language_pl: 'pl', + text_ru: 'Нью-Джерси', + language_ru: 'ru', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text_fr: 'États-Unis', + language_fr: 'fr', + text_nl: 'Verenigde Staten van Amerika', + language_nl: 'nl', + text_it: "Stati Uniti d'America", + language_it: 'it', + text_es: 'Estados Unidos', + language_es: 'es', + text_pt: 'Estados Unidos', + language_pt: 'pt', + text_pl: 'Stany Zjednoczone', + language_pl: 'pl', + text_ru: 'США', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.4994460186306076', + type: 'Feature', + place_type: ['address'], + relevance: 0.914815, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6MzIyNTIzODItMTM4My00YjAyLThiNTUtOTAwMGFiMDNiYmQy', + }, + text_en: 'Hamburg Road', + place_name_en: 'Hamburg Road, Parsippany, New Jersey 07054, United States', + text: 'Hamburg Road', + place_name: 'Hamburg Road, Parsippany, New Jersey 07054, United States', + text_de: 'Hamburg Road', + place_name_de: + 'Hamburg Road, Parsippany-Troy Hills Township, New Jersey 07054, Vereinigte Staaten', + text_fr: 'Hamburg Road', + place_name_fr: 'Hamburg Road, Parsippany-Troy Hills, New Jersey 07054, États-Unis', + text_nl: 'Hamburg Road', + place_name_nl: + 'Hamburg Road, Parsippany-Troy Hills, New Jersey 07054, Verenigde Staten van Amerika', + text_it: 'Hamburg Road', + place_name_it: "Hamburg Road, Parsippany-Troy Hills, New Jersey 07054, Stati Uniti d'America", + text_es: 'Hamburg Road', + place_name_es: 'Hamburg Road, Parsippany-Troy Hills, Nueva Jersey 07054, Estados Unidos', + text_pt: 'Hamburg Road', + place_name_pt: 'Hamburg Road, Parsippany-Troy Hills, Nova Jérsia 07054, Estados Unidos', + text_pl: 'Hamburg Road', + place_name_pl: 'Hamburg Road, Parsippany-Troy Hills, New Jersey 07054, Stany Zjednoczone', + text_ru: 'Hamburg Road', + place_name_ru: 'Hamburg Road, Парсиппани-Трой-Хилс, Нью-Джерси 07054, США', + center: [-74.436622, 40.859052], + geometry: { + type: 'Point', + coordinates: [-74.436622, 40.859052], + }, + context: [ + { + id: 'postcode.19074796', + mapbox_id: 'dXJuOm1ieHBsYzpBU01PN0E', + text_en: '07054', + text: '07054', + text_de: '07054', + text_fr: '07054', + text_nl: '07054', + text_it: '07054', + text_es: '07054', + text_pt: '07054', + text_pl: '07054', + text_ru: '07054', + }, + { + id: 'place.252618988', + mapbox_id: 'dXJuOm1ieHBsYzpEdzZvN0E', + wikidata: 'Q532344', + text_en: 'Parsippany', + language_en: 'en', + text: 'Parsippany', + language: 'en', + text_de: 'Parsippany-Troy Hills Township', + language_de: 'de', + text_fr: 'Parsippany-Troy Hills', + language_fr: 'fr', + text_nl: 'Parsippany-Troy Hills', + language_nl: 'nl', + text_it: 'Parsippany-Troy Hills', + language_it: 'it', + text_es: 'Parsippany-Troy Hills', + language_es: 'es', + text_pt: 'Parsippany-Troy Hills', + language_pt: 'es', + text_pl: 'Parsippany-Troy Hills', + language_pl: 'nl', + text_ru: 'Парсиппани-Трой-Хилс', + language_ru: 'ru', + }, + { + id: 'district.16525036', + mapbox_id: 'dXJuOm1ieHBsYzovQ2Jz', + wikidata: 'Q498163', + text_en: 'Morris County', + language_en: 'en', + text: 'Morris County', + language: 'en', + text_de: 'Morris County', + language_de: 'de', + text_fr: 'comté de Morris', + language_fr: 'fr', + text_nl: 'Morris County', + language_nl: 'nl', + text_it: 'contea di Morris', + language_it: 'it', + text_es: 'Condado de Morris', + language_es: 'es', + text_pt: 'Condado de Morris', + language_pt: 'pt', + text_pl: 'Hrabstwo Morris', + language_pl: 'pl', + text_ru: 'Моррис', + language_ru: 'ru', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_en: 'New Jersey', + language_en: 'en', + text: 'New Jersey', + language: 'en', + text_de: 'New Jersey', + language_de: 'de', + text_fr: 'New Jersey', + language_fr: 'fr', + text_nl: 'New Jersey', + language_nl: 'nl', + text_it: 'New Jersey', + language_it: 'it', + text_es: 'Nueva Jersey', + language_es: 'es', + text_pt: 'Nova Jérsia', + language_pt: 'pt', + text_pl: 'New Jersey', + language_pl: 'pl', + text_ru: 'Нью-Джерси', + language_ru: 'ru', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text_fr: 'États-Unis', + language_fr: 'fr', + text_nl: 'Verenigde Staten van Amerika', + language_nl: 'nl', + text_it: "Stati Uniti d'America", + language_it: 'it', + text_es: 'Estados Unidos', + language_es: 'es', + text_pt: 'Estados Unidos', + language_pt: 'pt', + text_pl: 'Stany Zjednoczone', + language_pl: 'pl', + text_ru: 'США', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7206046822993882', + type: 'Feature', + place_type: ['address'], + relevance: 0.914815, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6OGNiMjYzOWMtZDAxYS00OWY3LThmNTEtZTllMmJjMDY4MWU2', + }, + text_en: 'Hamburg Avenue', + place_name_en: 'Hamburg Avenue, Egg Harbor City, New Jersey 08215, United States', + text: 'Hamburg Avenue', + place_name: 'Hamburg Avenue, Egg Harbor City, New Jersey 08215, United States', + text_de: 'Hamburg Avenue', + place_name_de: 'Hamburg Avenue, Egg Harbor City, New Jersey 08215, Vereinigte Staaten', + text_fr: 'Hamburg Avenue', + place_name_fr: 'Hamburg Avenue, Egg Harbor City, New Jersey 08215, États-Unis', + text_nl: 'Hamburg Avenue', + place_name_nl: + 'Hamburg Avenue, Egg Harbor City, New Jersey 08215, Verenigde Staten van Amerika', + text_it: 'Hamburg Avenue', + place_name_it: "Hamburg Avenue, Egg Harbor City, New Jersey 08215, Stati Uniti d'America", + text_es: 'Hamburg Avenue', + place_name_es: 'Hamburg Avenue, Egg Harbor City, Nueva Jersey 08215, Estados Unidos', + text_pt: 'Hamburg Avenue', + place_name_pt: 'Hamburg Avenue, Egg Harbor City, Nova Jérsia 08215, Estados Unidos', + text_pl: 'Hamburg Avenue', + place_name_pl: 'Hamburg Avenue, Egg Harbor City, New Jersey 08215, Stany Zjednoczone', + text_ru: 'Hamburg Avenue', + place_name_ru: 'Hamburg Avenue, Эгг Харбор Сити, Нью-Джерси 08215, США', + center: [-74.634456, 39.551661], + geometry: { + type: 'Point', + coordinates: [-74.634456, 39.551661], + }, + context: [ + { + id: 'postcode.22638316', + mapbox_id: 'dXJuOm1ieHBsYzpBVmx1N0E', + text_en: '08215', + text: '08215', + text_de: '08215', + text_fr: '08215', + text_nl: '08215', + text_it: '08215', + text_es: '08215', + text_pt: '08215', + text_pl: '08215', + text_ru: '08215', + }, + { + id: 'locality.378645228', + mapbox_id: 'dXJuOm1ieHBsYzpGcEdxN0E', + text_en: 'Mullica Township', + language_en: 'en', + text: 'Mullica Township', + language: 'en', + text_de: 'Mullica Township', + language_de: 'en', + text_fr: 'Mullica Township', + language_fr: 'en', + text_nl: 'Mullica Township', + language_nl: 'en', + text_it: 'Mullica Township', + language_it: 'en', + text_es: 'Mullica Township', + language_es: 'en', + text_pt: 'Mullica Township', + text_pl: 'Mullica Township', + language_pl: 'en', + text_ru: 'Mullica Township', + }, + { + id: 'place.97724652', + mapbox_id: 'dXJuOm1ieHBsYzpCZE1vN0E', + wikidata: 'Q1082961', + text_en: 'Egg Harbor City', + language_en: 'en', + text: 'Egg Harbor City', + language: 'en', + text_de: 'Egg Harbor City', + language_de: 'de', + text_fr: 'Egg Harbor City', + language_fr: 'fr', + text_nl: 'Egg Harbor City', + language_nl: 'nl', + text_it: 'Egg Harbor City', + language_it: 'it', + text_es: 'Egg Harbor City', + language_es: 'es', + text_pt: 'Egg Harbor City', + language_pt: 'pt', + text_pl: 'Egg Harbor City', + language_pl: 'pl', + text_ru: 'Эгг Харбор Сити', + language_ru: 'kk', + }, + { + id: 'district.837356', + mapbox_id: 'dXJuOm1ieHBsYzpETWJz', + wikidata: 'Q497928', + text_en: 'Atlantic County', + language_en: 'en', + text: 'Atlantic County', + language: 'en', + text_de: 'Atlantic County', + language_de: 'de', + text_fr: "comté d'Atlantic", + language_fr: 'fr', + text_nl: 'Atlantic County', + language_nl: 'nl', + text_it: 'contea di Atlantic', + language_it: 'it', + text_es: 'Condado de Atlantic', + language_es: 'es', + text_pt: 'Condado de Atlantic', + language_pt: 'pt', + text_pl: 'Hrabstwo Atlantic', + language_pl: 'pl', + text_ru: 'Атлантик', + language_ru: 'ru', + }, + { + id: 'region.156908', + mapbox_id: 'dXJuOm1ieHBsYzpBbVRz', + wikidata: 'Q1408', + short_code: 'US-NJ', + text_en: 'New Jersey', + language_en: 'en', + text: 'New Jersey', + language: 'en', + text_de: 'New Jersey', + language_de: 'de', + text_fr: 'New Jersey', + language_fr: 'fr', + text_nl: 'New Jersey', + language_nl: 'nl', + text_it: 'New Jersey', + language_it: 'it', + text_es: 'Nueva Jersey', + language_es: 'es', + text_pt: 'Nova Jérsia', + language_pt: 'pt', + text_pl: 'New Jersey', + language_pl: 'pl', + text_ru: 'Нью-Джерси', + language_ru: 'ru', + }, + { + id: 'country.8940', + mapbox_id: 'dXJuOm1ieHBsYzpJdXc', + wikidata: 'Q30', + short_code: 'us', + text_en: 'United States', + language_en: 'en', + text: 'United States', + language: 'en', + text_de: 'Vereinigte Staaten', + language_de: 'de', + text_fr: 'États-Unis', + language_fr: 'fr', + text_nl: 'Verenigde Staten van Amerika', + language_nl: 'nl', + text_it: "Stati Uniti d'America", + language_it: 'it', + text_es: 'Estados Unidos', + language_es: 'es', + text_pt: 'Estados Unidos', + language_pt: 'pt', + text_pl: 'Stany Zjednoczone', + language_pl: 'pl', + text_ru: 'США', + language_ru: 'ru', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/index.ts b/backend/test/fetchMock/index.ts new file mode 100644 index 000000000..e5915b648 --- /dev/null +++ b/backend/test/fetchMock/index.ts @@ -0,0 +1,11 @@ +import type { Context } from '@src/context' + +import { mapboxResponses } from './mapboxResponses' + +export const fetchMock: Context['fetch'] = (url) => { + const response: unknown = mapboxResponses[url] // eslint-disable-line security/detect-object-injection + if (!response) { + throw new Error(`Missing response for url: ${url}`) + } + return Promise.resolve(response) +} diff --git a/backend/test/fetchMock/leipzig.ts b/backend/test/fetchMock/leipzig.ts new file mode 100644 index 000000000..419cbc256 --- /dev/null +++ b/backend/test/fetchMock/leipzig.ts @@ -0,0 +1,653 @@ +export const leipzig = { + type: 'FeatureCollection', + query: ['leipzig'], + features: [ + { + id: 'place.45697082', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBcmxJT2c', + wikidata: 'Q2079', + }, + text_en: 'Leipzig', + language_en: 'en', + place_name_en: 'Leipzig, Saxony, Germany', + text: 'Leipzig', + language: 'en', + place_name: 'Leipzig, Saxony, Germany', + text_de: 'Leipzig', + language_de: 'de', + place_name_de: 'Leipzig, Sachsen, Deutschland', + text_fr: 'Leipzig', + language_fr: 'fr', + place_name_fr: 'Leipzig, Saxe, Allemagne', + text_nl: 'Leipzig', + language_nl: 'nl', + place_name_nl: 'Leipzig, Saksen, Duitsland', + text_it: 'Lipsia', + language_it: 'it', + place_name_it: 'Lipsia, Sassonia, Germania', + text_es: 'Leipzig', + language_es: 'es', + place_name_es: 'Leipzig, Sajonia, Alemania', + text_pt: 'Leipzig', + language_pt: 'pt', + place_name_pt: 'Leipzig, Saxónia, Alemanha', + text_pl: 'Lipsk', + language_pl: 'pl', + place_name_pl: 'Lipsk, Saksonia, Niemcy', + text_ru: 'Лейпциг', + language_ru: 'ru', + place_name_ru: 'Лейпциг, Саксония, Германия', + bbox: [12.236476, 51.23808, 12.542577, 51.447065], + center: [12.375101, 51.34083], + geometry: { + type: 'Point', + coordinates: [12.375101, 51.34083], + }, + context: [ + { + id: 'region.74810', + mapbox_id: 'dXJuOm1ieHBsYzpBU1E2', + wikidata: 'Q1202', + short_code: 'DE-SN', + text_en: 'Saxony', + language_en: 'en', + text: 'Saxony', + language: 'en', + text_de: 'Sachsen', + language_de: 'de', + text_fr: 'Saxe', + language_fr: 'fr', + text_nl: 'Saksen', + language_nl: 'nl', + text_it: 'Sassonia', + language_it: 'it', + text_es: 'Sajonia', + language_es: 'es', + text_pt: 'Saxónia', + language_pt: 'pt', + text_pl: 'Saksonia', + language_pl: 'pl', + text_ru: 'Саксония', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'place.18655359', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBUnlvZnc', + wikidata: 'Q4257515', + }, + text_en: 'Leipzig', + language_en: 'de', + place_name_en: 'Leipzig, Varnensky District, Chelyabinsk, Russia', + text: 'Leipzig', + language: 'de', + place_name: 'Leipzig, Varnensky District, Chelyabinsk, Russia', + text_de: 'Leipzig', + language_de: 'de', + place_name_de: 'Leipzig, Warnenski rajon, Oblast Tscheljabinsk, Russland', + text_fr: 'Leipzig', + language_fr: 'nl', + place_name_fr: 'Leipzig, Raïon de Varna, oblast de Tcheliabinsk, Russie', + text_nl: 'Leipzig', + language_nl: 'nl', + place_name_nl: 'Leipzig, Varnenskiy rayon, Oblast Tsjeljabinsk, Rusland', + text_it: 'Лейпциг', + place_name_it: "Лейпциг, Varnenskij rajon, oblast' di Čeljabinsk, Russia", + text_es: 'Leipzig', + language_es: 'nl', + place_name_es: 'Leipzig, Raïon de Varna, Cheliábinsk, Rusia', + text_pt: 'Лейпциг', + place_name_pt: 'Лейпциг, Varnenskij rajon, Oblast de Cheliabinsk, Rússia', + text_pl: 'Leipzig', + language_pl: 'nl', + place_name_pl: 'Leipzig, Varnenskiy rayon, Obwód czelabiński, Rosja', + text_ru: 'Лейпциг', + language_ru: 'ru', + place_name_ru: 'Лейпциг, Варненский район, Челябинская область, Россия', + center: [61.049587, 53.568829], + geometry: { + type: 'Point', + coordinates: [61.049587, 53.568829], + }, + context: [ + { + id: 'district.1967810', + mapbox_id: 'dXJuOm1ieHBsYzpIZ2JD', + wikidata: 'Q1658354', + text_en: 'Varnensky District', + language_en: 'en', + text: 'Varnensky District', + language: 'en', + text_de: 'Warnenski rajon', + language_de: 'de', + text_fr: 'Raïon de Varna', + language_fr: 'fr', + text_nl: 'Varnenskiy rayon', + language_nl: 'nl', + text_it: 'Varnenskij rajon', + language_it: 'it', + text_es: 'Raïon de Varna', + language_es: 'fr', + text_pt: 'Varnenskij rajon', + language_pt: 'it', + text_pl: 'Varnenskiy rayon', + language_pl: 'nl', + text_ru: 'Варненский район', + language_ru: 'ru', + }, + { + id: 'region.468162', + mapbox_id: 'dXJuOm1ieHBsYzpCeVRD', + wikidata: 'Q5714', + short_code: 'RU-CHE', + text_en: 'Chelyabinsk', + language_en: 'en', + text: 'Chelyabinsk', + language: 'en', + text_de: 'Oblast Tscheljabinsk', + language_de: 'de', + text_fr: 'oblast de Tcheliabinsk', + language_fr: 'fr', + text_nl: 'Oblast Tsjeljabinsk', + language_nl: 'nl', + text_it: "oblast' di Čeljabinsk", + language_it: 'it', + text_es: 'Cheliábinsk', + language_es: 'es', + text_pt: 'Oblast de Cheliabinsk', + language_pt: 'pt', + text_pl: 'Obwód czelabiński', + language_pl: 'pl', + text_ru: 'Челябинская область', + language_ru: 'ru', + }, + { + id: 'country.8898', + mapbox_id: 'dXJuOm1ieHBsYzpJc0k', + wikidata: 'Q159', + short_code: 'ru', + text_en: 'Russia', + language_en: 'en', + text: 'Russia', + language: 'en', + text_de: 'Russland', + language_de: 'de', + text_fr: 'Russie', + language_fr: 'fr', + text_nl: 'Rusland', + language_nl: 'nl', + text_it: 'Russia', + language_it: 'it', + text_es: 'Rusia', + language_es: 'es', + text_pt: 'Rússia', + language_pt: 'pt', + text_pl: 'Rosja', + language_pl: 'pl', + text_ru: 'Россия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7058830234246124', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6OGQ4MmQ0YmYtNWViYy00OTY2LWE1MTMtNDlkYzNiNDBhZjhm', + }, + text_en: 'Leipzig Way', + place_name_en: 'Leipzig Way, Greenwith South Australia 5125, Australia', + text: 'Leipzig Way', + place_name: 'Leipzig Way, Greenwith South Australia 5125, Australia', + text_de: 'Leipzig Way', + place_name_de: 'Leipzig Way, Greenwith South Australia 5125, Australien', + text_fr: 'Leipzig Way', + place_name_fr: 'Leipzig Way, Greenwith Australie-Méridionale 5125, Australie', + text_nl: 'Leipzig Way', + place_name_nl: 'Leipzig Way, Greenwith Zuid-Australië 5125, Australië', + text_it: 'Leipzig Way', + place_name_it: 'Leipzig Way, Greenwith Australia Meridionale 5125, Australia', + text_es: 'Leipzig Way', + place_name_es: 'Leipzig Way, Greenwith Australia Meridional 5125, Australia', + text_pt: 'Leipzig Way', + place_name_pt: 'Leipzig Way, Greenwith Austrália Meridional 5125, Austrália', + text_pl: 'Leipzig Way', + place_name_pl: 'Leipzig Way, Greenwith Australia Południowa 5125, Australia', + text_ru: 'Leipzig Way', + place_name_ru: 'Leipzig Way, Greenwith Южная Австралия 5125, Австралия', + center: [138.709402, -34.765821], + geometry: { + type: 'Point', + coordinates: [138.709402, -34.765821], + }, + context: [ + { + id: 'postcode.15560206', + mapbox_id: 'dXJuOm1ieHBsYzo3VzRP', + text_en: '5125', + text: '5125', + text_de: '5125', + text_fr: '5125', + text_nl: '5125', + text_it: '5125', + text_es: '5125', + text_pt: '5125', + text_pl: '5125', + text_ru: '5125', + }, + { + id: 'locality.265447950', + mapbox_id: 'dXJuOm1ieHBsYzpEOUpxRGc', + wikidata: 'Q5604921', + text_en: 'Greenwith', + language_en: 'en', + text: 'Greenwith', + language: 'en', + text_de: 'Greenwith', + language_de: 'en', + text_fr: 'Greenwith', + language_fr: 'fr', + text_nl: 'Greenwith', + language_nl: 'fr', + text_it: 'Greenwith', + language_it: 'fr', + text_es: 'Greenwith', + language_es: 'fr', + text_pt: 'Greenwith', + text_pl: 'Greenwith', + language_pl: 'en', + text_ru: 'Greenwith', + }, + { + id: 'place.51214', + mapbox_id: 'dXJuOm1ieHBsYzp5QTQ', + wikidata: 'Q5112', + text_en: 'Adelaide', + language_en: 'en', + text: 'Adelaide', + language: 'en', + text_de: 'Adelaide', + language_de: 'de', + text_fr: 'Adélaïde', + language_fr: 'fr', + text_nl: 'Adelaide', + language_nl: 'nl', + text_it: 'Adelaide', + language_it: 'it', + text_es: 'Adelaida', + language_es: 'es', + text_pt: 'Adelaide', + language_pt: 'pt', + text_pl: 'Adelaide', + language_pl: 'pl', + text_ru: 'Аделаида', + language_ru: 'ru', + }, + { + id: 'region.66574', + mapbox_id: 'dXJuOm1ieHBsYzpBUVFP', + wikidata: 'Q35715', + short_code: 'AU-SA', + text_en: 'South Australia', + language_en: 'en', + text: 'South Australia', + language: 'en', + text_de: 'South Australia', + language_de: 'de', + text_fr: 'Australie-Méridionale', + language_fr: 'fr', + text_nl: 'Zuid-Australië', + language_nl: 'nl', + text_it: 'Australia Meridionale', + language_it: 'it', + text_es: 'Australia Meridional', + language_es: 'es', + text_pt: 'Austrália Meridional', + language_pt: 'pt', + text_pl: 'Australia Południowa', + language_pl: 'pl', + text_ru: 'Южная Австралия', + language_ru: 'ru', + }, + { + id: 'country.8718', + mapbox_id: 'dXJuOm1ieHBsYzpJZzQ', + wikidata: 'Q408', + short_code: 'au', + text_en: 'Australia', + language_en: 'en', + text: 'Australia', + language: 'en', + text_de: 'Australien', + language_de: 'de', + text_fr: 'Australie', + language_fr: 'fr', + text_nl: 'Australië', + language_nl: 'nl', + text_it: 'Australia', + language_it: 'it', + text_es: 'Australia', + language_es: 'es', + text_pt: 'Austrália', + language_pt: 'pt', + text_pl: 'Australia', + language_pl: 'pl', + text_ru: 'Австралия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.3203988662803706', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6NGUzNzNkZjItNmI4Ny00ODdkLWI3MzQtZjVkMGJlMjI1NjA5', + }, + text_en: 'Leipzig', + place_name_en: 'Leipzig, Osorno, Los Lagos 5290000, Chile', + text: 'Leipzig', + place_name: 'Leipzig, Osorno, Los Lagos 5290000, Chile', + text_de: 'Leipzig', + place_name_de: 'Leipzig, Osorno, Región de Los Lagos 5290000, Chile', + text_fr: 'Leipzig', + place_name_fr: 'Leipzig, Osorno, Région des Lacs 5290000, Chili', + text_nl: 'Leipzig', + place_name_nl: 'Leipzig, Osorno, Los Lagos 5290000, Chili', + text_it: 'Leipzig', + place_name_it: 'Leipzig, Osorno, regione di Los Lagos 5290000, Cile', + text_es: 'Leipzig', + place_name_es: 'Leipzig, Osorno, Región de Los Lagos 5290000, Chile', + text_pt: 'Leipzig', + place_name_pt: 'Leipzig, Osorno, Região de Los Lagos 5290000, Chile', + text_pl: 'Leipzig', + place_name_pl: 'Leipzig, Osorno, Los Lagos 5290000, Chile', + text_ru: 'Leipzig', + place_name_ru: 'Leipzig, Осорно, Лос-Лагос 5290000, Чили', + center: [-73.1087, -40.570176], + geometry: { + type: 'Point', + coordinates: [-73.1087, -40.570176], + }, + context: [ + { + id: 'postcode.2002479', + mapbox_id: 'dXJuOm1ieHBsYzpIbzR2', + text_en: '5290000', + text: '5290000', + text_de: '5290000', + text_fr: '5290000', + text_nl: '5290000', + text_it: '5290000', + text_es: '5290000', + text_pt: '5290000', + text_pl: '5290000', + text_ru: '5290000', + }, + { + id: 'locality.2656815', + mapbox_id: 'dXJuOm1ieHBsYzpLSW92', + text_en: 'Cementerio Municipal', + text: 'Cementerio Municipal', + text_de: 'Cementerio Municipal', + text_fr: 'Cementerio Municipal', + text_nl: 'Cementerio Municipal', + text_it: 'Cementerio Municipal', + text_es: 'Cementerio Municipal', + text_pt: 'Cementerio Municipal', + text_pl: 'Cementerio Municipal', + text_ru: 'Cementerio Municipal', + }, + { + id: 'place.1574959', + mapbox_id: 'dXJuOm1ieHBsYzpHQWd2', + wikidata: 'Q51059', + text_en: 'Osorno', + language_en: 'en', + text: 'Osorno', + language: 'en', + text_de: 'Osorno', + language_de: 'de', + text_fr: 'Osorno', + language_fr: 'fr', + text_nl: 'Osorno', + language_nl: 'nl', + text_it: 'Osorno', + language_it: 'it', + text_es: 'Osorno', + language_es: 'es', + text_pt: 'Osorno', + language_pt: 'pt', + text_pl: 'Osorno', + language_pl: 'pl', + text_ru: 'Осорно', + language_ru: 'ru', + }, + { + id: 'region.99375', + mapbox_id: 'dXJuOm1ieHBsYzpBWVF2', + wikidata: 'Q2178', + short_code: 'CL-LL', + text_en: 'Los Lagos', + language_en: 'en', + text: 'Los Lagos', + language: 'en', + text_de: 'Región de Los Lagos', + language_de: 'de', + text_fr: 'Région des Lacs', + language_fr: 'fr', + text_nl: 'Los Lagos', + language_nl: 'nl', + text_it: 'regione di Los Lagos', + language_it: 'it', + text_es: 'Región de Los Lagos', + language_es: 'es', + text_pt: 'Região de Los Lagos', + language_pt: 'pt', + text_pl: 'Los Lagos', + language_pl: 'pl', + text_ru: 'Лос-Лагос', + language_ru: 'ru', + }, + { + id: 'country.8751', + mapbox_id: 'dXJuOm1ieHBsYzpJaTg', + wikidata: 'Q298', + short_code: 'cl', + text_en: 'Chile', + language_en: 'en', + text: 'Chile', + language: 'en', + text_de: 'Chile', + language_de: 'de', + text_fr: 'Chili', + language_fr: 'fr', + text_nl: 'Chili', + language_nl: 'nl', + text_it: 'Cile', + language_it: 'it', + text_es: 'Chile', + language_es: 'es', + text_pt: 'Chile', + language_pt: 'pt', + text_pl: 'Chile', + language_pl: 'pl', + text_ru: 'Чили', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7521078080010634', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6OTFkZjliYjctNWJiZC00YTk3LTk1ZjktOTZjMGVkNzU3MjY3', + }, + text_en: 'Leipziger Straße', + language_en: 'de', + place_name_en: 'Leipziger Straße, 43003 Chomutov, Ústí nad Labem, Czech Republic', + text: 'Leipziger Straße', + language: 'de', + place_name: 'Leipziger Straße, 43003 Chomutov, Ústí nad Labem, Czech Republic', + text_de: 'Leipziger Straße', + language_de: 'de', + place_name_de: 'Leipziger Straße, 43003 Chomutov, Ústecký kraj, Tschechien', + text_fr: 'Lipská', + place_name_fr: "Lipská, 43003 Chomutov, région d'Ústí nad Labem, Tchéquie", + text_nl: 'Lipská', + place_name_nl: 'Lipská, 43003 Chomutov, Ústí nad Labem, Tsjechië', + text_it: 'Lipská', + place_name_it: 'Lipská, 43003 Chomutov, regione di Ústí nad Labem, Repubblica Ceca', + text_es: 'Lipská', + place_name_es: 'Lipská, 43003 Chomutov, Región de Ústí nad Labem, República Checa', + text_pt: 'Lipská', + place_name_pt: 'Lipská, 43003 Chomutov, Ústí nad Labem, Chéquia', + text_pl: 'Lipská', + place_name_pl: 'Lipská, 43003 Chomutov, Kraj ustecki, Czechy', + text_ru: 'Lipská', + place_name_ru: 'Lipská, 43003 Хомутов, Устецкий край, Чехия', + center: [13.385229, 50.472246], + geometry: { + type: 'Point', + coordinates: [13.385229, 50.472246], + }, + context: [ + { + id: 'postcode.7521078080010634', + text_en: '43003', + text: '43003', + text_de: '43003', + text_fr: '43003', + text_nl: '43003', + text_it: '43003', + text_es: '43003', + text_pt: '43003', + text_pl: '43003', + text_ru: '43003', + }, + { + id: 'place.6162489', + mapbox_id: 'dXJuOm1ieHBsYzpYZ2c1', + wikidata: 'Q146356', + text_en: 'Chomutov', + language_en: 'en', + text: 'Chomutov', + language: 'en', + text_de: 'Chomutov', + language_de: 'de', + text_fr: 'Chomutov', + language_fr: 'fr', + text_nl: 'Chomutov', + language_nl: 'nl', + text_it: 'Chomutov', + language_it: 'it', + text_es: 'Chomutov', + language_es: 'es', + text_pt: 'Chomutov', + language_pt: 'pt', + text_pl: 'Chomutov', + language_pl: 'pl', + text_ru: 'Хомутов', + language_ru: 'ru', + }, + { + id: 'region.74809', + mapbox_id: 'dXJuOm1ieHBsYzpBU1E1', + wikidata: 'Q192702', + short_code: 'CZ-42', + text_en: 'Ústí nad Labem', + language_en: 'en', + text: 'Ústí nad Labem', + language: 'en', + text_de: 'Ústecký kraj', + language_de: 'de', + text_fr: "région d'Ústí nad Labem", + language_fr: 'fr', + text_nl: 'Ústí nad Labem', + language_nl: 'nl', + text_it: 'regione di Ústí nad Labem', + language_it: 'it', + text_es: 'Región de Ústí nad Labem', + language_es: 'es', + text_pt: 'Ústí nad Labem', + language_pt: 'pt', + text_pl: 'Kraj ustecki', + language_pl: 'pl', + text_ru: 'Устецкий край', + language_ru: 'ru', + }, + { + id: 'country.8761', + mapbox_id: 'dXJuOm1ieHBsYzpJams', + wikidata: 'Q213', + short_code: 'cz', + text_en: 'Czech Republic', + language_en: 'en', + text: 'Czech Republic', + language: 'en', + text_de: 'Tschechien', + language_de: 'de', + text_fr: 'Tchéquie', + language_fr: 'fr', + text_nl: 'Tsjechië', + language_nl: 'nl', + text_it: 'Repubblica Ceca', + language_it: 'it', + text_es: 'República Checa', + language_es: 'es', + text_pt: 'Chéquia', + language_pt: 'pt', + text_pl: 'Czechy', + language_pl: 'pl', + text_ru: 'Чехия', + language_ru: 'ru', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/mapboxResponses.ts b/backend/test/fetchMock/mapboxResponses.ts new file mode 100644 index 000000000..b813c38e8 --- /dev/null +++ b/backend/test/fetchMock/mapboxResponses.ts @@ -0,0 +1,32 @@ +import { berlinDe } from './berlinDe' +import { berlinEn } from './berlinEn' +import { berlinGermany } from './berlinGermany' +import { empty } from './empty' +import { hamburg } from './hamburg' +import { hamburgNY } from './hamburgNY' +import { leipzig } from './leipzig' +import { paris } from './paris' +import { welzheim } from './welzheim' + +export const mapboxResponses = { + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Berlin.json?access_token=MAPBOX_TOKEN&types=region,place,country&language=en': + berlinEn, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Berlin.json?access_token=MAPBOX_TOKEN&types=region,place,country&language=de': + berlinDe, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Berlin%2C%20Germany.json?access_token=MAPBOX_TOKEN&types=region,place,country,address&language=en,de,fr,nl,it,es,pt,pl,ru': + berlinGermany, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/GbHtsd4sdHa.json?access_token=MAPBOX_TOKEN&types=region,place,country&language=en': + empty, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/.json?access_token=MAPBOX_TOKEN&types=region,place,country&language=en': + empty, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Welzheim%2C%20Baden-W%C3%BCrttemberg%2C%20Germany.json?access_token=MAPBOX_TOKEN&types=region,place,country,address&language=en,de,fr,nl,it,es,pt,pl,ru': + welzheim, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Hamburg%2C%20Germany.json?access_token=MAPBOX_TOKEN&types=region,place,country,address&language=en,de,fr,nl,it,es,pt,pl,ru': + hamburg, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Hamburg%2C%20New%20Jersey%2C%20United%20States.json?access_token=MAPBOX_TOKEN&types=region,place,country,address&language=en,de,fr,nl,it,es,pt,pl,ru': + hamburgNY, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Leipzig.json?access_token=MAPBOX_TOKEN&types=region,place,country,address&language=en,de,fr,nl,it,es,pt,pl,ru': + leipzig, + 'https://api.mapbox.com/geocoding/v5/mapbox.places/Paris%2C%20France.json?access_token=MAPBOX_TOKEN&types=region,place,country,address&language=en,de,fr,nl,it,es,pt,pl,ru': + paris, +} as const diff --git a/backend/test/fetchMock/paris.ts b/backend/test/fetchMock/paris.ts new file mode 100644 index 000000000..b331059f0 --- /dev/null +++ b/backend/test/fetchMock/paris.ts @@ -0,0 +1,615 @@ +export const paris = { + type: 'FeatureCollection', + query: ['paris', 'france'], + features: [ + { + id: 'place.894029', + type: 'Feature', + place_type: ['region', 'place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpEYVJO', + wikidata: 'Q90', + short_code: 'FR-75', + }, + text_en: 'Paris', + language_en: 'en', + place_name_en: 'Paris, France', + text: 'Paris', + language: 'en', + place_name: 'Paris, France', + text_de: 'Paris', + language_de: 'de', + place_name_de: 'Paris, Frankreich', + text_fr: 'Paris', + language_fr: 'fr', + place_name_fr: 'Paris, France', + text_nl: 'Parijs', + language_nl: 'nl', + place_name_nl: 'Parijs, Frankrijk', + text_it: 'Parigi', + language_it: 'it', + place_name_it: 'Parigi, Francia', + text_es: 'París', + language_es: 'es', + place_name_es: 'París, Francia', + text_pt: 'Paris', + language_pt: 'pt', + place_name_pt: 'Paris, França', + text_pl: 'Paryż', + language_pl: 'pl', + place_name_pl: 'Paryż, Francja', + text_ru: 'Париж', + language_ru: 'ru', + place_name_ru: 'Париж, Франция', + bbox: [2.224229, 48.815562, 2.469851, 48.902148], + center: [2.348392, 48.853495], + geometry: { + type: 'Point', + coordinates: [2.348392, 48.853495], + }, + context: [ + { + id: 'country.8781', + mapbox_id: 'dXJuOm1ieHBsYzpJazA', + wikidata: 'Q142', + short_code: 'fr', + text_en: 'France', + language_en: 'en', + text: 'France', + language: 'en', + text_de: 'Frankreich', + language_de: 'de', + text_fr: 'France', + language_fr: 'fr', + text_nl: 'Frankrijk', + language_nl: 'nl', + text_it: 'Francia', + language_it: 'it', + text_es: 'Francia', + language_es: 'es', + text_pt: 'França', + language_pt: 'pt', + text_pl: 'Francja', + language_pl: 'pl', + text_ru: 'Франция', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7942827143743488', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6ZGUyMmI5NjYtODFjMi00YjA4LWJkODgtMGIxNWE2YWE0Y2I2', + }, + text_en: 'Paris', + place_name_en: 'Paris, 83170 Brignoles, France', + text: 'Paris', + place_name: 'Paris, 83170 Brignoles, France', + text_de: 'Paris', + place_name_de: 'Paris, 83170 Brignoles, Frankreich', + text_fr: 'Paris', + place_name_fr: 'Paris, 83170 Brignoles, France', + text_nl: 'Paris', + place_name_nl: 'Paris, 83170 Brignoles, Frankrijk', + text_it: 'Paris', + place_name_it: 'Paris, 83170 Brignoles, Francia', + text_es: 'Paris', + place_name_es: 'Paris, 83170 Brignoles, Francia', + text_pt: 'Paris', + place_name_pt: 'Paris, 83170 Brignoles, França', + text_pl: 'Paris', + place_name_pl: 'Paris, 83170 Brignoles, Francja', + text_ru: 'Paris', + place_name_ru: 'Paris, 83170 Бриньоль, Франция', + center: [6.069561, 43.415211], + geometry: { + type: 'Point', + coordinates: [6.069561, 43.415211], + }, + context: [ + { + id: 'neighborhood.23768141', + mapbox_id: 'dXJuOm1ieHBsYzpBV3FzVFE', + text_en: 'Extension Annees 80-', + language_en: 'fr', + text: 'Extension Annees 80-', + language: 'fr', + text_de: 'Extension Annees 80-', + text_fr: 'Extension Annees 80-', + language_fr: 'fr', + text_nl: 'Extension Annees 80-', + language_nl: 'fr', + text_it: 'Extension Annees 80-', + language_it: 'fr', + text_es: 'Extension Annees 80-', + language_es: 'fr', + text_pt: 'Extension Annees 80-', + text_pl: 'Extension Annees 80-', + text_ru: 'Extension Annees 80-', + }, + { + id: 'postcode.43822669', + mapbox_id: 'dXJuOm1ieHBsYzpBcHl1VFE', + text_en: '83170', + text: '83170', + text_de: '83170', + text_fr: '83170', + text_nl: '83170', + text_it: '83170', + text_es: '83170', + text_pt: '83170', + text_pl: '83170', + text_ru: '83170', + }, + { + id: 'place.37988429', + mapbox_id: 'dXJuOm1ieHBsYzpBa09vVFE', + wikidata: 'Q207584', + text_en: 'Brignoles', + language_en: 'en', + text: 'Brignoles', + language: 'en', + text_de: 'Brignoles', + language_de: 'de', + text_fr: 'Brignoles', + language_fr: 'fr', + text_nl: 'Brignoles', + language_nl: 'nl', + text_it: 'Brignoles', + language_it: 'it', + text_es: 'Brignoles', + language_es: 'es', + text_pt: 'Brignoles', + language_pt: 'pt', + text_pl: 'Brignoles', + language_pl: 'pl', + text_ru: 'Бриньоль', + language_ru: 'ru', + }, + { + id: 'region.451661', + mapbox_id: 'dXJuOm1ieHBsYzpCdVJO', + wikidata: 'Q12789', + short_code: 'FR-83', + text_en: 'Var', + language_en: 'en', + text: 'Var', + language: 'en', + text_de: 'Département Var', + language_de: 'de', + text_fr: 'Var', + language_fr: 'fr', + text_nl: 'Var', + language_nl: 'nl', + text_it: 'Varo', + language_it: 'it', + text_es: 'Var', + language_es: 'es', + text_pt: 'Var', + language_pt: 'pt', + text_pl: 'Var', + language_pl: 'pl', + text_ru: 'Вар', + language_ru: 'ru', + }, + { + id: 'country.8781', + mapbox_id: 'dXJuOm1ieHBsYzpJazA', + wikidata: 'Q142', + short_code: 'fr', + text_en: 'France', + language_en: 'en', + text: 'France', + language: 'en', + text_de: 'Frankreich', + language_de: 'de', + text_fr: 'France', + language_fr: 'fr', + text_nl: 'Frankrijk', + language_nl: 'nl', + text_it: 'Francia', + language_it: 'it', + text_es: 'Francia', + language_es: 'es', + text_pt: 'França', + language_pt: 'pt', + text_pl: 'Francja', + language_pl: 'pl', + text_ru: 'Франция', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.1606141678135750', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6YTI3YjI5ODYtNGI1ZS00MTBiLThkOTEtOWJjOGUzZmE4NjA0', + }, + text_en: 'Paris', + place_name_en: "Paris, 11230 Sainte-Colombe-sur-l'Hers, France", + text: 'Paris', + place_name: "Paris, 11230 Sainte-Colombe-sur-l'Hers, France", + text_de: 'Paris', + place_name_de: "Paris, 11230 Sainte-Colombe-sur-l'Hers, Frankreich", + text_fr: 'Paris', + place_name_fr: "Paris, 11230 Sainte-Colombe-sur-l'Hers, France", + text_nl: 'Paris', + place_name_nl: "Paris, 11230 Sainte-Colombe-sur-l'Hers, Frankrijk", + text_it: 'Paris', + place_name_it: "Paris, 11230 Sainte-Colombe-sur-l'Hers, Francia", + text_es: 'Paris', + place_name_es: "Paris, 11230 Sainte-Colombe-sur-l'Hers, Francia", + text_pt: 'Paris', + place_name_pt: "Paris, 11230 Sainte-Colombe-sur-l'Hers, França", + text_pl: 'Paris', + place_name_pl: "Paris, 11230 Sainte-Colombe-sur-l'Hers, Francja", + text_ru: 'Paris', + place_name_ru: 'Paris, 11230 Сент-Коломб-сюр-л’Эр, Франция', + center: [1.957948, 42.947813], + geometry: { + type: 'Point', + coordinates: [1.957948, 42.947813], + }, + context: [ + { + id: 'postcode.3993165', + mapbox_id: 'dXJuOm1ieHBsYzpQTzVO', + text_en: '11230', + text: '11230', + text_de: '11230', + text_fr: '11230', + text_nl: '11230', + text_it: '11230', + text_es: '11230', + text_pt: '11230', + text_pl: '11230', + text_ru: '11230', + }, + { + id: 'place.218073165', + mapbox_id: 'dXJuOm1ieHBsYzpEUCtJVFE', + wikidata: 'Q1081836', + text_en: "Sainte-Colombe-sur-l'Hers", + language_en: 'en', + text: "Sainte-Colombe-sur-l'Hers", + language: 'en', + text_de: "Sainte-Colombe-sur-l'Hers", + language_de: 'de', + text_fr: "Sainte-Colombe-sur-l'Hers", + language_fr: 'fr', + text_nl: "Sainte-Colombe-sur-l'Hers", + language_nl: 'nl', + text_it: "Sainte-Colombe-sur-l'Hers", + language_it: 'it', + text_es: "Sainte-Colombe-sur-l'Hers", + language_es: 'es', + text_pt: "Sainte-Colombe-sur-l'Hers", + language_pt: 'pt', + text_pl: "Sainte-Colombe-sur-l'Hers", + language_pl: 'pl', + text_ru: 'Сент-Коломб-сюр-л’Эр', + language_ru: 'ru', + }, + { + id: 'region.713805', + mapbox_id: 'dXJuOm1ieHBsYzpDdVJO', + wikidata: 'Q3207', + short_code: 'FR-11', + text_en: 'Aude', + language_en: 'en', + text: 'Aude', + language: 'en', + text_de: 'Département Aude', + language_de: 'de', + text_fr: 'Aude', + language_fr: 'fr', + text_nl: 'Aude', + language_nl: 'nl', + text_it: 'Aude', + language_it: 'it', + text_es: 'Aude', + language_es: 'es', + text_pt: 'Aude', + language_pt: 'pt', + text_pl: 'Aude', + language_pl: 'pl', + text_ru: 'Од', + language_ru: 'ru', + }, + { + id: 'country.8781', + mapbox_id: 'dXJuOm1ieHBsYzpJazA', + wikidata: 'Q142', + short_code: 'fr', + text_en: 'France', + language_en: 'en', + text: 'France', + language: 'en', + text_de: 'Frankreich', + language_de: 'de', + text_fr: 'France', + language_fr: 'fr', + text_nl: 'Frankrijk', + language_nl: 'nl', + text_it: 'Francia', + language_it: 'it', + text_es: 'Francia', + language_es: 'es', + text_pt: 'França', + language_pt: 'pt', + text_pl: 'Francja', + language_pl: 'pl', + text_ru: 'Франция', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.8644476532166668', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6MTY1YmU5ZTAtMWZiMS00MjhhLThlZmQtN2NkMDVhZjZkNzE3', + }, + text_en: 'Paris', + place_name_en: 'Paris, 36120 Jeu-les-Bois, France', + text: 'Paris', + place_name: 'Paris, 36120 Jeu-les-Bois, France', + text_de: 'Paris', + place_name_de: 'Paris, 36120 Jeu-les-Bois, Frankreich', + text_fr: 'Paris', + place_name_fr: 'Paris, 36120 Jeu-les-Bois, France', + text_nl: 'Paris', + place_name_nl: 'Paris, 36120 Jeu-les-Bois, Frankrijk', + text_it: 'Paris', + place_name_it: 'Paris, 36120 Jeu-les-Bois, Francia', + text_es: 'Paris', + place_name_es: 'Paris, 36120 Jeu-les-Bois, Francia', + text_pt: 'Paris', + place_name_pt: 'Paris, 36120 Jeu-les-Bois, França', + text_pl: 'Paris', + place_name_pl: 'Paris, 36120 Jeu-les-Bois, Francja', + text_ru: 'Paris', + place_name_ru: 'Paris, 36120 Же-ле-Буа, Франция', + center: [1.811749, 46.694191], + geometry: { + type: 'Point', + coordinates: [1.811749, 46.694191], + }, + context: [ + { + id: 'postcode.17755725', + mapbox_id: 'dXJuOm1ieHBsYzpBUTd1VFE', + text_en: '36120', + text: '36120', + text_de: '36120', + text_fr: '36120', + text_nl: '36120', + text_it: '36120', + text_es: '36120', + text_pt: '36120', + text_pl: '36120', + text_ru: '36120', + }, + { + id: 'place.111659085', + mapbox_id: 'dXJuOm1ieHBsYzpCcWZJVFE', + wikidata: 'Q596397', + text_en: 'Jeu-les-Bois', + language_en: 'en', + text: 'Jeu-les-Bois', + language: 'en', + text_de: 'Jeu-les-Bois', + language_de: 'de', + text_fr: 'Jeu-les-Bois', + language_fr: 'fr', + text_nl: 'Jeu-les-Bois', + language_nl: 'nl', + text_it: 'Jeu-les-Bois', + language_it: 'it', + text_es: 'Jeu-les-Bois', + language_es: 'es', + text_pt: 'Jeu-les-Bois', + language_pt: 'pt', + text_pl: 'Jeu-les-Bois', + language_pl: 'pl', + text_ru: 'Же-ле-Буа', + language_ru: 'ru', + }, + { + id: 'region.74829', + mapbox_id: 'dXJuOm1ieHBsYzpBU1JO', + wikidata: 'Q12553', + short_code: 'FR-36', + text_en: 'Indre', + language_en: 'en', + text: 'Indre', + language: 'en', + text_de: 'Département Indre', + language_de: 'de', + text_fr: 'Indre', + language_fr: 'fr', + text_nl: 'Indre', + language_nl: 'nl', + text_it: 'Indre', + language_it: 'it', + text_es: 'Indre', + language_es: 'es', + text_pt: 'Indre', + language_pt: 'pt', + text_pl: 'Indre', + language_pl: 'pl', + text_ru: 'Эндр', + language_ru: 'ru', + }, + { + id: 'country.8781', + mapbox_id: 'dXJuOm1ieHBsYzpJazA', + wikidata: 'Q142', + short_code: 'fr', + text_en: 'France', + language_en: 'en', + text: 'France', + language: 'en', + text_de: 'Frankreich', + language_de: 'de', + text_fr: 'France', + language_fr: 'fr', + text_nl: 'Frankrijk', + language_nl: 'nl', + text_it: 'Francia', + language_it: 'it', + text_es: 'Francia', + language_es: 'es', + text_pt: 'França', + language_pt: 'pt', + text_pl: 'Francja', + language_pl: 'pl', + text_ru: 'Франция', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.8865196537941870', + type: 'Feature', + place_type: ['address'], + relevance: 1, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6NjU2N2E5ODgtN2I4Yi00ZjU2LWEzZWUtYjk4Y2YwMjQzY2Ey', + }, + text_en: 'Paris', + place_name_en: 'Paris, 31560 Saint-Léon, France', + text: 'Paris', + place_name: 'Paris, 31560 Saint-Léon, France', + text_de: 'Paris', + place_name_de: 'Paris, 31560 Saint-Léon, Frankreich', + text_fr: 'Paris', + place_name_fr: 'Paris, 31560 Saint-Léon, France', + text_nl: 'Paris', + place_name_nl: 'Paris, 31560 Saint-Léon, Frankrijk', + text_it: 'Paris', + place_name_it: 'Paris, 31560 Saint-Léon, Francia', + text_es: 'Paris', + place_name_es: 'Paris, 31560 Saint-Léon, Francia', + text_pt: 'Paris', + place_name_pt: 'Paris, 31560 Saint-Léon, França', + text_pl: 'Paris', + place_name_pl: 'Paris, 31560 Saint-Léon, Francja', + text_ru: 'Paris', + place_name_ru: 'Paris, 31560 Сен-Леон, Франция', + center: [1.549305, 43.419569], + geometry: { + type: 'Point', + coordinates: [1.549305, 43.419569], + }, + context: [ + { + id: 'postcode.15044173', + mapbox_id: 'dXJuOm1ieHBsYzo1WTVO', + text_en: '31560', + text: '31560', + text_de: '31560', + text_fr: '31560', + text_nl: '31560', + text_it: '31560', + text_es: '31560', + text_pt: '31560', + text_pl: '31560', + text_ru: '31560', + }, + { + id: 'place.229107789', + mapbox_id: 'dXJuOm1ieHBsYzpEYWZvVFE', + wikidata: 'Q1362198', + text_en: 'Saint-Léon', + language_en: 'en', + text: 'Saint-Léon', + language: 'en', + text_de: 'Saint-Léon', + language_de: 'de', + text_fr: 'Saint-Léon', + language_fr: 'fr', + text_nl: 'Saint-Léon', + language_nl: 'nl', + text_it: 'Saint-Léon', + language_it: 'it', + text_es: 'Saint-Léon', + language_es: 'es', + text_pt: 'Saint-Léon', + language_pt: 'pt', + text_pl: 'Saint-Léon', + language_pl: 'pl', + text_ru: 'Сен-Леон', + language_ru: 'ru', + }, + { + id: 'region.42061', + mapbox_id: 'dXJuOm1ieHBsYzpwRTA', + wikidata: 'Q12538', + short_code: 'FR-31', + text_en: 'Haute-Garonne', + language_en: 'en', + text: 'Haute-Garonne', + language: 'en', + text_de: 'Haute-Garonne', + language_de: 'de', + text_fr: 'Haute-Garonne', + language_fr: 'fr', + text_nl: 'Haute-Garonne', + language_nl: 'nl', + text_it: 'Alta Garonna', + language_it: 'it', + text_es: 'Alto Garona', + language_es: 'es', + text_pt: 'Alta Garona', + language_pt: 'pt', + text_pl: 'Górna Garonna', + language_pl: 'pl', + text_ru: 'Верхняя Гаронна', + language_ru: 'ru', + }, + { + id: 'country.8781', + mapbox_id: 'dXJuOm1ieHBsYzpJazA', + wikidata: 'Q142', + short_code: 'fr', + text_en: 'France', + language_en: 'en', + text: 'France', + language: 'en', + text_de: 'Frankreich', + language_de: 'de', + text_fr: 'France', + language_fr: 'fr', + text_nl: 'Frankrijk', + language_nl: 'nl', + text_it: 'Francia', + language_it: 'it', + text_es: 'Francia', + language_es: 'es', + text_pt: 'França', + language_pt: 'pt', + text_pl: 'Francja', + language_pl: 'pl', + text_ru: 'Франция', + language_ru: 'ru', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/fetchMock/welzheim.ts b/backend/test/fetchMock/welzheim.ts new file mode 100644 index 000000000..17384146a --- /dev/null +++ b/backend/test/fetchMock/welzheim.ts @@ -0,0 +1,686 @@ +export const welzheim = { + type: 'FeatureCollection', + query: ['welzheim', 'baden', 'württemberg', 'germany'], + features: [ + { + id: 'place.85084218', + type: 'Feature', + place_type: ['place'], + relevance: 1, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpCUkpJT2c', + wikidata: 'Q82421', + }, + text_en: 'Welzheim', + language_en: 'en', + place_name_en: 'Welzheim, arrondissement de Rems-Murr, Baden-Württemberg, Germany', + text: 'Welzheim', + language: 'en', + place_name: 'Welzheim, arrondissement de Rems-Murr, Baden-Württemberg, Germany', + text_de: 'Welzheim', + language_de: 'de', + place_name_de: 'Welzheim, Rems-Murr-Kreis, Baden-Württemberg, Deutschland', + text_fr: 'Welzheim', + language_fr: 'fr', + place_name_fr: 'Welzheim, arrondissement de Rems-Murr, Bade-Wurtemberg, Allemagne', + text_nl: 'Welzheim', + language_nl: 'nl', + place_name_nl: 'Welzheim, arrondissement de Rems-Murr, Baden-Württemberg, Duitsland', + text_it: 'Welzheim', + language_it: 'it', + place_name_it: 'Welzheim, circondario del Rems-Murr, Baden-Württemberg, Germania', + text_es: 'Welzheim', + language_es: 'es', + place_name_es: 'Welzheim, arrondissement de Rems-Murr, Baden-Wurtemberg, Alemania', + text_pt: 'Welzheim', + language_pt: 'pt', + place_name_pt: 'Welzheim, circondario del Rems-Murr, Baden-Württemberg, Alemanha', + text_pl: 'Welzheim', + language_pl: 'pl', + place_name_pl: 'Welzheim, Powiat Rems-Murr, Badenia-Wirtembergia, Niemcy', + text_ru: 'Вельцхайм', + language_ru: 'ru', + place_name_ru: 'Вельцхайм, Ремс-Мур, Баден-Вюртемберг, Германия', + bbox: [9.555711, 48.840845, 9.69537, 48.923906], + center: [9.634301, 48.874393], + geometry: { + type: 'Point', + coordinates: [9.634301, 48.874393], + }, + context: [ + { + id: 'district.2598458', + mapbox_id: 'dXJuOm1ieHBsYzpKNlk2', + wikidata: 'Q8528', + text_en: 'arrondissement de Rems-Murr', + language_en: 'fr', + text: 'arrondissement de Rems-Murr', + language: 'fr', + text_de: 'Rems-Murr-Kreis', + language_de: 'de', + text_fr: 'arrondissement de Rems-Murr', + language_fr: 'fr', + text_nl: 'arrondissement de Rems-Murr', + language_nl: 'fr', + text_it: 'circondario del Rems-Murr', + language_it: 'it', + text_es: 'arrondissement de Rems-Murr', + language_es: 'fr', + text_pt: 'circondario del Rems-Murr', + language_pt: 'it', + text_pl: 'Powiat Rems-Murr', + language_pl: 'pl', + text_ru: 'Ремс-Мур', + language_ru: 'ru', + }, + { + id: 'region.132154', + mapbox_id: 'dXJuOm1ieHBsYzpBZ1E2', + wikidata: 'Q985', + short_code: 'DE-BW', + text_en: 'Baden-Württemberg', + language_en: 'en', + text: 'Baden-Württemberg', + language: 'en', + text_de: 'Baden-Württemberg', + language_de: 'de', + text_fr: 'Bade-Wurtemberg', + language_fr: 'fr', + text_nl: 'Baden-Württemberg', + language_nl: 'nl', + text_it: 'Baden-Württemberg', + language_it: 'it', + text_es: 'Baden-Wurtemberg', + language_es: 'es', + text_pt: 'Baden-Württemberg', + language_pt: 'pt', + text_pl: 'Badenia-Wirtembergia', + language_pl: 'pl', + text_ru: 'Баден-Вюртемберг', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'region.132154', + type: 'Feature', + place_type: ['region'], + relevance: 0.703704, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpBZ1E2', + wikidata: 'Q985', + short_code: 'DE-BW', + }, + text_en: 'Baden-Württemberg', + language_en: 'en', + place_name_en: 'Baden-Württemberg, Germany', + text: 'Baden-Württemberg', + language: 'en', + place_name: 'Baden-Württemberg, Germany', + text_de: 'Baden-Württemberg', + language_de: 'de', + place_name_de: 'Baden-Württemberg, Deutschland', + text_fr: 'Bade-Wurtemberg', + language_fr: 'fr', + place_name_fr: 'Bade-Wurtemberg, Allemagne', + text_nl: 'Baden-Württemberg', + language_nl: 'nl', + place_name_nl: 'Baden-Württemberg, Duitsland', + text_it: 'Baden-Württemberg', + language_it: 'it', + place_name_it: 'Baden-Württemberg, Germania', + text_es: 'Baden-Wurtemberg', + language_es: 'es', + place_name_es: 'Baden-Wurtemberg, Alemania', + text_pt: 'Baden-Württemberg', + language_pt: 'pt', + place_name_pt: 'Baden-Württemberg, Alemanha', + text_pl: 'Badenia-Wirtembergia', + language_pl: 'pl', + place_name_pl: 'Badenia-Wirtembergia, Niemcy', + text_ru: 'Баден-Вюртемберг', + language_ru: 'ru', + place_name_ru: 'Баден-Вюртемберг, Германия', + bbox: [7.511749, 47.532404, 10.495575, 49.791327], + center: [9.180013, 48.778449], + geometry: { + type: 'Point', + coordinates: [9.180013, 48.778449], + }, + context: [ + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7757118904863240', + type: 'Feature', + place_type: ['address'], + relevance: 0.67254, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6YTZkMmM2YTYtZDY3ZC00MjE1LWIyZmYtOTUwODQ4MTk3MmIz', + }, + text_en: 'German-Götz-Straße', + place_name_en: 'German-Götz-Straße, 72469 Meßstetten, Germany', + text: 'German-Götz-Straße', + place_name: 'German-Götz-Straße, 72469 Meßstetten, Germany', + text_de: 'German-Götz-Straße', + place_name_de: 'German-Götz-Straße, 72469 Meßstetten, Deutschland', + text_fr: 'German-Götz-Straße', + place_name_fr: 'German-Götz-Straße, 72469 Meßstetten, Allemagne', + text_nl: 'German-Götz-Straße', + place_name_nl: 'German-Götz-Straße, 72469 Meßstetten, Duitsland', + text_it: 'German-Götz-Straße', + place_name_it: 'German-Götz-Straße, 72469 Meßstetten, Germania', + text_es: 'German-Götz-Straße', + place_name_es: 'German-Götz-Straße, 72469 Meßstetten, Alemania', + text_pt: 'German-Götz-Straße', + place_name_pt: 'German-Götz-Straße, 72469 Meßstetten, Alemanha', + text_pl: 'German-Götz-Straße', + place_name_pl: 'German-Götz-Straße, 72469 Meßstetten, Niemcy', + text_ru: 'German-Götz-Straße', + place_name_ru: 'German-Götz-Straße, 72469 Месштеттен, Германия', + center: [8.920287, 48.189669], + geometry: { + type: 'Point', + coordinates: [8.920287, 48.189669], + }, + context: [ + { + id: 'postcode.41586234', + mapbox_id: 'dXJuOm1ieHBsYzpBbnFPT2c', + text_en: '72469', + text: '72469', + text_de: '72469', + text_fr: '72469', + text_nl: '72469', + text_it: '72469', + text_es: '72469', + text_pt: '72469', + text_pl: '72469', + text_ru: '72469', + }, + { + id: 'locality.150301242', + mapbox_id: 'dXJuOm1ieHBsYzpDUFZxT2c', + wikidata: 'Q18337859', + text_en: 'Hossingen', + language_en: 'en', + text: 'Hossingen', + language: 'en', + text_de: 'Hossingen', + language_de: 'de', + text_fr: 'Hossingen', + language_fr: 'fr', + text_nl: 'Hossingen', + language_nl: 'nl', + text_it: 'Hossingen', + language_it: 'fr', + text_es: 'Hossingen', + language_es: 'fr', + text_pt: 'Hossingen', + text_pl: 'Hossingen', + language_pl: 'nl', + text_ru: 'Hossingen', + }, + { + id: 'place.50759738', + mapbox_id: 'dXJuOm1ieHBsYzpBd2FJT2c', + wikidata: 'Q515661', + text_en: 'Meßstetten', + language_en: 'en', + text: 'Meßstetten', + language: 'en', + text_de: 'Meßstetten', + language_de: 'de', + text_fr: 'Meßstetten', + language_fr: 'fr', + text_nl: 'Meßstetten', + language_nl: 'nl', + text_it: 'Meßstetten', + language_it: 'it', + text_es: 'Meßstetten', + language_es: 'es', + text_pt: 'Meßstetten', + language_pt: 'pt', + text_pl: 'Meßstetten', + language_pl: 'pl', + text_ru: 'Месштеттен', + language_ru: 'ru', + }, + { + id: 'district.2795066', + mapbox_id: 'dXJuOm1ieHBsYzpLcVk2', + wikidata: 'Q8233', + text_en: 'arrondissement de Zollernalb', + language_en: 'fr', + text: 'arrondissement de Zollernalb', + language: 'fr', + text_de: 'Zollernalbkreis', + language_de: 'de', + text_fr: 'arrondissement de Zollernalb', + language_fr: 'fr', + text_nl: 'arrondissement de Zollernalb', + language_nl: 'fr', + text_it: 'circondario dello Zollernalb', + language_it: 'it', + text_es: 'arrondissement de Zollernalb', + language_es: 'fr', + text_pt: 'circondario dello Zollernalb', + language_pt: 'it', + text_pl: 'Powiat Zollernalb', + language_pl: 'pl', + text_ru: 'Цоллернальб', + language_ru: 'ru', + }, + { + id: 'region.132154', + mapbox_id: 'dXJuOm1ieHBsYzpBZ1E2', + wikidata: 'Q985', + short_code: 'DE-BW', + text_en: 'Baden-Württemberg', + language_en: 'en', + text: 'Baden-Württemberg', + language: 'en', + text_de: 'Baden-Württemberg', + language_de: 'de', + text_fr: 'Bade-Wurtemberg', + language_fr: 'fr', + text_nl: 'Baden-Württemberg', + language_nl: 'nl', + text_it: 'Baden-Württemberg', + language_it: 'it', + text_es: 'Baden-Wurtemberg', + language_es: 'es', + text_pt: 'Baden-Württemberg', + language_pt: 'pt', + text_pl: 'Badenia-Wirtembergia', + language_pl: 'pl', + text_ru: 'Баден-Вюртемберг', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'address.7729037509260214', + type: 'Feature', + place_type: ['address'], + relevance: 0.67254, + properties: { + accuracy: 'street', + mapbox_id: 'dXJuOm1ieGFkci1zdHI6ZTFhMjYyZTEtN2I4Ny00YTYxLThlYmMtNTQxYzQyYzljMzQ2', + }, + text_en: 'Germanstraße', + place_name_en: 'Germanstraße, 78048 Villingen-Schwenningen, Germany', + text: 'Germanstraße', + place_name: 'Germanstraße, 78048 Villingen-Schwenningen, Germany', + text_de: 'Germanstraße', + place_name_de: 'Germanstraße, 78048 Villingen-Schwenningen, Deutschland', + text_fr: 'Germanstraße', + place_name_fr: 'Germanstraße, 78048 Villingen-Schwenningen, Allemagne', + text_nl: 'Germanstraße', + place_name_nl: 'Germanstraße, 78048 Villingen-Schwenningen, Duitsland', + text_it: 'Germanstraße', + place_name_it: 'Germanstraße, 78048 Villingen-Schwenningen, Germania', + text_es: 'Germanstraße', + place_name_es: 'Germanstraße, 78048 Villingen-Schwenningen, Alemania', + text_pt: 'Germanstraße', + place_name_pt: 'Germanstraße, 78048 Villingen-Schwenningen, Alemanha', + text_pl: 'Germanstraße', + place_name_pl: 'Germanstraße, 78048 Villingen-Schwenningen, Niemcy', + text_ru: 'Germanstraße', + place_name_ru: 'Germanstraße, 78048 Филлинген-Швеннинген, Германия', + center: [8.430963, 48.073201], + geometry: { + type: 'Point', + coordinates: [8.430963, 48.073201], + }, + context: [ + { + id: 'postcode.45977146', + mapbox_id: 'dXJuOm1ieHBsYzpBcjJPT2c', + text_en: '78048', + text: '78048', + text_de: '78048', + text_fr: '78048', + text_nl: '78048', + text_it: '78048', + text_es: '78048', + text_pt: '78048', + text_pl: '78048', + text_ru: '78048', + }, + { + id: 'locality.351808058', + mapbox_id: 'dXJuOm1ieHBsYzpGUGdxT2c', + wikidata: 'Q47501154', + text_en: 'Villingen', + language_en: 'en', + text: 'Villingen', + language: 'en', + text_de: 'Villingen', + language_de: 'de', + text_fr: 'Villingen', + language_fr: 'nl', + text_nl: 'Villingen', + language_nl: 'nl', + text_it: 'Villingen', + language_it: 'it', + text_es: 'Villingen', + language_es: 'nl', + text_pt: 'Villingen', + language_pt: 'it', + text_pl: 'Villingen', + language_pl: 'nl', + text_ru: 'Villingen', + }, + { + id: 'place.81537082', + mapbox_id: 'dXJuOm1ieHBsYzpCTndvT2c', + wikidata: 'Q3865', + text_en: 'Villingen-Schwenningen', + language_en: 'en', + text: 'Villingen-Schwenningen', + language: 'en', + text_de: 'Villingen-Schwenningen', + language_de: 'de', + text_fr: 'Villingen-Schwenningen', + language_fr: 'fr', + text_nl: 'Villingen-Schwenningen', + language_nl: 'nl', + text_it: 'Villingen-Schwenningen', + language_it: 'it', + text_es: 'Villingen-Schwenningen', + language_es: 'es', + text_pt: 'Villingen-Schwenningen', + language_pt: 'pt', + text_pl: 'Villingen-Schwenningen', + language_pl: 'pl', + text_ru: 'Филлинген-Швеннинген', + language_ru: 'ru', + }, + { + id: 'district.2729530', + mapbox_id: 'dXJuOm1ieHBsYzpLYVk2', + wikidata: 'Q8203', + text_en: 'Schwarzwald-Baar district', + language_en: 'en', + text: 'Schwarzwald-Baar district', + language: 'en', + text_de: 'Schwarzwald-Baar-Kreis', + language_de: 'de', + text_fr: 'arrondissement de Forêt-Noire-Baar', + language_fr: 'fr', + text_nl: 'arrondissement de Forêt-Noire-Baar', + language_nl: 'fr', + text_it: 'circondario della Foresta Nera-Baar', + language_it: 'it', + text_es: 'arrondissement de Forêt-Noire-Baar', + language_es: 'fr', + text_pt: 'circondario della Foresta Nera-Baar', + language_pt: 'it', + text_pl: 'Powiat Schwarzwald-Baar', + language_pl: 'pl', + text_ru: 'Шварцвальд-Бар', + language_ru: 'ru', + }, + { + id: 'region.132154', + mapbox_id: 'dXJuOm1ieHBsYzpBZ1E2', + wikidata: 'Q985', + short_code: 'DE-BW', + text_en: 'Baden-Württemberg', + language_en: 'en', + text: 'Baden-Württemberg', + language: 'en', + text_de: 'Baden-Württemberg', + language_de: 'de', + text_fr: 'Bade-Wurtemberg', + language_fr: 'fr', + text_nl: 'Baden-Württemberg', + language_nl: 'nl', + text_it: 'Baden-Württemberg', + language_it: 'it', + text_es: 'Baden-Wurtemberg', + language_es: 'es', + text_pt: 'Baden-Württemberg', + language_pt: 'pt', + text_pl: 'Badenia-Wirtembergia', + language_pl: 'pl', + text_ru: 'Баден-Вюртемберг', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + { + id: 'place.85002298', + type: 'Feature', + place_type: ['place'], + relevance: 0.574074, + properties: { + mapbox_id: 'dXJuOm1ieHBsYzpCUkVJT2c', + wikidata: 'Q509998', + }, + text_en: 'Wellheim', + language_en: 'en', + place_name_en: "Wellheim, arrondissement d'Eichstätt, Bavaria, Germany", + text: 'Wellheim', + language: 'en', + place_name: "Wellheim, arrondissement d'Eichstätt, Bavaria, Germany", + text_de: 'Wellheim', + language_de: 'de', + place_name_de: 'Wellheim, Kreis Eichstätt, Bayern, Deutschland', + text_fr: 'Wellheim', + language_fr: 'fr', + place_name_fr: "Wellheim, arrondissement d'Eichstätt, Bavière, Allemagne", + text_nl: 'Wellheim', + language_nl: 'nl', + place_name_nl: 'Wellheim, Landkreis Eichstätt, Beieren, Duitsland', + text_it: 'Wellheim', + language_it: 'it', + place_name_it: 'Wellheim, circondario di Eichstätt, Baviera, Germania', + text_es: 'Wellheim', + language_es: 'es', + place_name_es: "Wellheim, arrondissement d'Eichstätt, Baviera, Alemania", + text_pt: 'Wellheim', + language_pt: 'pt', + place_name_pt: 'Wellheim, circondario di Eichstätt, Baviera, Alemanha', + text_pl: 'Wellheim', + language_pl: 'pl', + place_name_pl: 'Wellheim, Powiat Eichstätt, Bawaria, Niemcy', + text_ru: 'Велльхайм', + language_ru: 'ru', + place_name_ru: 'Велльхайм, Айхштет, Бавария, Германия', + bbox: [11.032347, 48.79008, 11.173361, 48.846386], + center: [11.080854, 48.817787], + geometry: { + type: 'Point', + coordinates: [11.080854, 48.817787], + }, + context: [ + { + id: 'district.460346', + mapbox_id: 'dXJuOm1ieHBsYzpCd1k2', + wikidata: 'Q10491', + text_en: "arrondissement d'Eichstätt", + language_en: 'fr', + text: "arrondissement d'Eichstätt", + language: 'fr', + text_de: 'Kreis Eichstätt', + language_de: 'de', + text_fr: "arrondissement d'Eichstätt", + language_fr: 'fr', + text_nl: 'Landkreis Eichstätt', + language_nl: 'nl', + text_it: 'circondario di Eichstätt', + language_it: 'it', + text_es: "arrondissement d'Eichstätt", + language_es: 'fr', + text_pt: 'circondario di Eichstätt', + language_pt: 'it', + text_pl: 'Powiat Eichstätt', + language_pl: 'pl', + text_ru: 'Айхштет', + language_ru: 'ru', + }, + { + id: 'region.123962', + mapbox_id: 'dXJuOm1ieHBsYzpBZVE2', + wikidata: 'Q980', + short_code: 'DE-BY', + text_en: 'Bavaria', + language_en: 'en', + text: 'Bavaria', + language: 'en', + text_de: 'Bayern', + language_de: 'de', + text_fr: 'Bavière', + language_fr: 'fr', + text_nl: 'Beieren', + language_nl: 'nl', + text_it: 'Baviera', + language_it: 'it', + text_es: 'Baviera', + language_es: 'es', + text_pt: 'Baviera', + language_pt: 'pt', + text_pl: 'Bawaria', + language_pl: 'pl', + text_ru: 'Бавария', + language_ru: 'ru', + }, + { + id: 'country.8762', + mapbox_id: 'dXJuOm1ieHBsYzpJam8', + wikidata: 'Q183', + short_code: 'de', + text_en: 'Germany', + language_en: 'en', + text: 'Germany', + language: 'en', + text_de: 'Deutschland', + language_de: 'de', + text_fr: 'Allemagne', + language_fr: 'fr', + text_nl: 'Duitsland', + language_nl: 'nl', + text_it: 'Germania', + language_it: 'it', + text_es: 'Alemania', + language_es: 'es', + text_pt: 'Alemanha', + language_pt: 'pt', + text_pl: 'Niemcy', + language_pl: 'pl', + text_ru: 'Германия', + language_ru: 'ru', + }, + ], + }, + ], + attribution: + 'NOTICE: © 2025 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained.', +} diff --git a/backend/test/helpers.ts b/backend/test/helpers.ts index f0c478b85..7c2b6f99e 100644 --- a/backend/test/helpers.ts +++ b/backend/test/helpers.ts @@ -19,8 +19,7 @@ export const TEST_CONFIG = { GRAPHQL_URI: 'http://localhost:4000', JWT_EXPIRES: '2y', - MAPBOX_TOKEN: - 'pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g', + MAPBOX_TOKEN: 'MAPBOX_TOKEN', JWT_SECRET: 'JWT_SECRET', PRIVATE_KEY_PASSPHRASE: 'PRIVATE_KEY_PASSPHRASE', @@ -61,22 +60,28 @@ interface OverwritableContextParams { authenticatedUser?: Context['user'] config?: Partial pubsub?: Context['pubsub'] + fetch?: Context['fetch'] } interface CreateTestServerOptions { context: () => OverwritableContextParams | Promise } +const crash = () => { + throw new Error('Mock me in your test!') +} + export const createApolloTestSetup = (opts?: CreateTestServerOptions) => { const defaultOpts: CreateTestServerOptions = { context: () => ({ authenticatedUser: null }) } const { context: testContext } = opts ?? defaultOpts const database = databaseContext() const context = async (req: { headers: { authorization?: string } }) => { - const { authenticatedUser, config = {}, pubsub } = await testContext() + const { authenticatedUser, config = {}, pubsub, fetch = crash } = await testContext() return getContext({ authenticatedUser, database, pubsub, config: { ...TEST_CONFIG, ...config }, + fetch, })(req) }