Skip to content

Commit 10660e8

Browse files
stepankuzmingithub-actions[bot]
authored andcommitted
Replace integration tests URI localization with transformRequest (internal-7187)
GitOrigin-RevId: 2e249becac232317289a82c3a516719e2b417794
1 parent 72c16c8 commit 10660e8

8 files changed

Lines changed: 71 additions & 93 deletions

File tree

debug/query-test.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,19 @@
1919
import {getAccessToken} from './access_token_generated.js';
2020

2121
mapboxgl.accessToken = getAccessToken();
22-
import {applyOperations} from 'http://localhost:9966/test/integration/lib/operation-handlers.js';
22+
import {applyOperations} from '../test/integration/lib/operation-handlers.js';
23+
import {transformRequest as baseTransformRequest} from '../test/integration/lib/transform-request.js';
24+
25+
function transformRequest(url, resourceTypeEnum) {
26+
const req = baseTransformRequest(url, resourceTypeEnum);
27+
return {url: req.url.replace(location.origin, `${location.origin}/test/integration/`)};
28+
}
2329

2430
async function fetchStyle() {
2531
let test = new URLSearchParams(location.search).get('test');
2632
if (!test) test = prompt('test name:', 'geometry/point');
2733

28-
const response = await fetch(`http://localhost:9966/test/integration/query-tests/${test}/style.json`);
34+
const response = await fetch(`../test/integration/query-tests/${test}/style.json`);
2935
const style = await response.json();
3036

3137
history.replaceState({}, '', `${location.pathname}?test=${test}`);
@@ -49,8 +55,6 @@
4955
container.style.width = width + 'px';
5056
container.style.height = height + 'px';
5157

52-
const transformRequest = url => ({url: url.replace('local://', 'http://localhost:9966/test/integration/')});
53-
5458
const map = window.map = new mapboxgl.Map({
5559
container,
5660
style,

debug/render-test.html

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,20 @@
1919
import {getAccessToken} from './access_token_generated.js';
2020

2121
mapboxgl.accessToken = getAccessToken();
22-
import {renderTestNow} from 'http://localhost:9966/test/integration/lib/constants.js';
23-
import {applyOperations} from 'http://localhost:9966/test/integration/lib/operation-handlers.js';
22+
import {renderTestNow} from '../test/integration/lib/constants.js';
23+
import {applyOperations} from '../test/integration/lib/operation-handlers.js';
24+
import {transformRequest as baseTransformRequest} from '../test/integration/lib/transform-request.js';
25+
26+
function transformRequest(url, resourceTypeEnum) {
27+
const req = baseTransformRequest(url, resourceTypeEnum);
28+
return {url: req.url.replace(location.origin, `${location.origin}/test/integration/`)};
29+
}
2430

2531
async function fetchStyle() {
2632
let test = new URLSearchParams(location.search).get('test');
2733
if (!test) test = prompt('test name:', 'text-writing-mode/line_label/mixed-multiline-horizontal-mode');
2834

29-
const response = await fetch(`http://localhost:9966/test/integration/render-tests/${test}/style.json`);
35+
const response = await fetch(`../test/integration/render-tests/${test}/style.json`);
3036
const style = await response.json();
3137

3238
return style;
@@ -93,13 +99,6 @@
9399
container.style.width = width + 'px';
94100
container.style.height = height + 'px';
95101

96-
const transformRequest = url => ({url:
97-
url
98-
.replace('local://mapbox-gl-styles/', 'http://localhost:9966/node_modules/mapbox-gl-styles/')
99-
.replace('local://mvt-fixtures/', 'http://localhost:9966/node_modules/@mapbox/mvt-fixtures/')
100-
.replace('local://', 'http://localhost:9966/test/integration/')
101-
});
102-
103102
const map = window.map = new mapboxgl.Map({
104103
container,
105104
style,

src/util/mapbox.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ import {uuid, validateUuid, storageAvailable, b64DecodeUnicode, b64EncodeUnicode
2121
import {postData, getData} from './ajax';
2222
import {getLivePerformanceMetrics} from '../util/live_performance';
2323

24+
import type {ResourceType as ResourceTypeEnum, RequestParameters} from './ajax';
2425
import type {LivePerformanceData} from '../util/live_performance';
25-
import type {RequestParameters, ResourceType as ResourceTypeEnum} from './ajax';
2626
import type {Cancelable} from '../types/cancelable';
2727
import type {TileJSON} from '../types/tilejson';
2828
import type {Map as MapboxMap} from "../ui/map";
29+
2930
import '../types/import-meta.d';
3031

3132
export type ResourceType = keyof typeof ResourceTypeEnum;
@@ -143,7 +144,6 @@ export class RequestManager {
143144
if (this._isSkuTokenExpired()) {
144145
this._createSkuToken();
145146
}
146-
147147
if (tileURL && !isMapboxURL(tileURL)) return tileURL;
148148

149149
const urlObject = parseUrl(tileURL);

test/integration/lib/localize-urls.js

Lines changed: 2 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import {createRequire} from 'module';
99
const require = createRequire(import.meta.url);
1010

1111
export default function localizeURLs(style, port) {
12-
localizeStyleURLs(style, port);
13-
1412
if (style.imports) {
1513
for (const importSpec of style.imports) {
1614
localizeURLs(importSpec.data, port);
@@ -19,9 +17,7 @@ export default function localizeURLs(style, port) {
1917

2018
if (style.metadata && style.metadata.test && style.metadata.test.operations) {
2119
style.metadata.test.operations.forEach((op) => {
22-
if (op[0] === 'addSource') {
23-
localizeSourceURLs(op[2], port);
24-
} else if (op[0] === 'setStyle') {
20+
if (op[0] === 'setStyle') {
2521
if (typeof op[1] === 'object') {
2622
localizeURLs(op[1], port);
2723
return;
@@ -48,76 +44,9 @@ export default function localizeURLs(style, port) {
4844
return;
4945
}
5046

51-
localizeStyleURLs(styleJSON, port);
52-
5347
op[1] = styleJSON;
5448
op[2] = {diff: false};
5549
}
5650
});
5751
}
58-
}
59-
60-
function localizeURL(url, port) {
61-
return url.replace(/^local:\/\//, `http://localhost:${port}/`);
62-
}
63-
64-
function localizeMapboxSpriteURL(url, port) {
65-
return url.replace(/^mapbox:\/\//, `http://localhost:${port}/`);
66-
}
67-
68-
function localizeMapboxFontsURL(url, port) {
69-
return url.replace(/^mapbox:\/\/fonts/, `http://localhost:${port}/glyphs`);
70-
}
71-
72-
function localizeMapboxTilesURL(url, port) {
73-
return url.replace(/^mapbox:\/\//, `http://localhost:${port}/tiles/`);
74-
}
75-
76-
function localizeMapboxTilesetURL(url, port) {
77-
return url.replace(/^mapbox:\/\//, `http://localhost:${port}/tilesets/`);
78-
}
79-
80-
export function localizeSourceURLs(source, port) {
81-
for (const tile in source.tiles) {
82-
source.tiles[tile] = localizeMapboxTilesURL(source.tiles[tile], port);
83-
source.tiles[tile] = localizeURL(source.tiles[tile], port);
84-
}
85-
86-
if (source.urls) {
87-
source.urls = source.urls.map((url) => localizeMapboxTilesetURL(url, port));
88-
source.urls = source.urls.map((url) => localizeURL(url, port));
89-
}
90-
91-
if (source.url) {
92-
source.url = localizeMapboxTilesetURL(source.url, port);
93-
source.url = localizeURL(source.url, port);
94-
}
95-
96-
if (source.data && typeof source.data == 'string') {
97-
source.data = localizeURL(source.data, port);
98-
}
99-
100-
for (const model in source.models) {
101-
source.models[model].uri = localizeURL(source.models[model].uri, port);
102-
}
103-
}
104-
105-
function localizeStyleURLs(style, port) {
106-
for (const source in style.sources) {
107-
localizeSourceURLs(style.sources[source], port);
108-
}
109-
if (style.models) {
110-
for (const modelId in style.models) {
111-
style.models[modelId] = localizeURL(style.models[modelId], port);
112-
}
113-
}
114-
if (style.sprite) {
115-
style.sprite = localizeMapboxSpriteURL(style.sprite, port);
116-
style.sprite = localizeURL(style.sprite, port);
117-
}
118-
119-
if (style.glyphs) {
120-
style.glyphs = localizeMapboxFontsURL(style.glyphs, port);
121-
style.glyphs = localizeURL(style.glyphs, port);
122-
}
123-
}
52+
}

test/integration/lib/middlewares.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import path, {dirname} from 'path';
44
import serveStatic from 'serve-static';
55
import {fileURLToPath} from 'url';
66
import {createRequire} from 'module';
7-
import {localizeSourceURLs} from './localize-urls.js';
87

98
const require = createRequire(import.meta.url);
109
const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -61,7 +60,6 @@ export async function tilesets(req, res) {
6160
const json = JSON.parse(fileContent);
6261

6362
const port = req.socket.localPort;
64-
localizeSourceURLs(json, port);
6563

6664
res.writeHead(200, {'Content-Type': 'application/json'});
6765
res.end(JSON.stringify(json));
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Transform Mapbox API URLs to localhost URLs for integration tests.
3+
*
4+
* This function reverses the URL normalization done by RequestManager:
5+
* - mapbox:// URLs are normalized to api.mapbox.com by normalize functions
6+
* - This transforms them back to localhost test paths
7+
*/
8+
export function transformRequest(url, resourceTypeEnum) {
9+
if (url.startsWith('local://')) {
10+
return {
11+
url: url
12+
.replace('local://mapbox-gl-styles/', `${location.origin}/node_modules/mapbox-gl-styles/`)
13+
.replace('local://mvt-fixtures/', `${location.origin}/node_modules/@mapbox/mvt-fixtures/`)
14+
.replace('local://', `${location.origin}/`)
15+
};
16+
}
17+
18+
if (url.startsWith('https://api.mapbox.com')) {
19+
const baseUrl = url.split('?')[0];
20+
switch (resourceTypeEnum) {
21+
case 'Source':
22+
return {url: baseUrl.replace(/^https:\/\/api\.mapbox\.com\/v4\/(.+)\.json$/, `${location.origin}/tilesets/$1`)};
23+
24+
case 'Tile':
25+
return {url: baseUrl.replace(/^https:\/\/api\.mapbox\.com\/(v4|raster\/v1|rasterarrays\/v1|3dtiles\/v1)\/(.+)$/, `${location.origin}/tiles/$2`)};
26+
27+
case 'Glyphs':
28+
return {url: baseUrl.replace(/^https:\/\/api\.mapbox\.com\/fonts\/v1\/(.+)$/, `${location.origin}/glyphs/$1`)};
29+
30+
case 'SpriteJSON':
31+
case 'SpriteImage': {
32+
const match = baseUrl.match(/^https:\/\/api\.mapbox\.com\/styles\/v1\/(.+)\/sprite(.*)$/);
33+
return {url: `${location.origin}/sprites/${match[1]}${match[2]}`};
34+
}
35+
36+
default:
37+
return {url: baseUrl.replace('https://api.mapbox.com/', `${location.origin}/`)};
38+
}
39+
}
40+
41+
return {url};
42+
}

test/integration/query-tests/index.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {integrationTests} from 'virtual:integration-tests';
1414
import {getStatsHTML, setupHTML, updateHTML} from '../../util/html_generator';
1515
import {mapboxgl} from '../lib/mapboxgl.js';
1616
import {sendFragment} from '../lib/utils';
17+
import {transformRequest} from '../lib/transform-request.js';
1718

1819
setupHTML();
1920

@@ -116,7 +117,9 @@ const getTest = (queryTestName) => async () => {
116117
fadeDuration: options.fadeDuration || 0,
117118
localIdeographFontFamily: options.localIdeographFontFamily || false,
118119
crossSourceCollisions: typeof options.crossSourceCollisions === "undefined" ? true : options.crossSourceCollisions,
119-
performanceMetricsCollection: false
120+
performanceMetricsCollection: false,
121+
transformRequest,
122+
testMode: true
120123
});
121124

122125
if (options.collisionDebug) {

test/integration/render-tests/utils.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {setupHTML} from '../../util/html_generator.js';
66
import {applyOperations} from '../lib/operation-handlers.js';
77
import {mapboxgl} from '../lib/mapboxgl.js';
88
import {renderTestNow} from '../lib/constants.js';
9+
import {transformRequest} from '../lib/transform-request.js';
910

1011
import type {Map as MapboxMap} from '../../../src/ui/map';
1112

@@ -160,7 +161,9 @@ export async function renderMap(style, options, currentTestName) {
160161
// ordinary instancing is enabled by default, manual is disabled
161162
forceManualRenderingForInstanceIDShaders: options.forceManualRenderingForInstanceIDShaders,
162163
},
163-
worldview: options.worldview
164+
worldview: options.worldview,
165+
transformRequest,
166+
testMode: true
164167
});
165168

166169
mapRef.current?.on('error', (e) => {

0 commit comments

Comments
 (0)