mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
ci(street-level): run the browser gate hermetically with Mapillary fixtures
The Street Level and panel gates never ran in CI, and the live gate needs a Mapillary token, the Mapillary network and real coverage at its test site, so everything users see was guarded only by manual runs (which a bad token and expired tile caches blocked twice this week). `qa-street-level.mjs --fixtures` (npm run qa:street-level:fixtures) answers the page's /api/mapillary/status and coverage-tile requests from generated tiles (a street grid with flat and 360 deg sequences, half captured three years ago; overview points from orbit) and blocks mapillary.com. Only the six steps that open a photo are skipped. Because the data is known, the 360 deg and SINCE steps also assert that the filters remove sequences, not just that counts do not grow. A unit test pins the fixture contents. New CI job "Street Level browser gate": install with headless Chrome, start a key-less dev server, run the fixture gate and qa:panel-resize. Locally, against a dev server with every key blanked: 14/14 on three consecutive runs, panel gate all pass. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
7ae5f52c89
commit
284cd0a93d
5 files changed
+211
-17
No files matched your search
@@ -2,6 +2,7 @@ import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import test from 'node:test';
|
||||
import {
|
||||
fixtureTile,
|
||||
EXPECTED_PROVIDERS,
|
||||
isCollapsed,
|
||||
RAIL_ORDER,
|
||||
@@ -44,3 +45,27 @@ test('the harness only runs its browser flow when executed directly', () => {
|
||||
assert.match(source, /PUPPETEER_EXECUTABLE_PATH/);
|
||||
assert.match(source, /--url/);
|
||||
});
|
||||
|
||||
test('fixture tiles give the hermetic gate something real to filter', async () => {
|
||||
const { decodeCoverageTile } =
|
||||
await import('../layers/streetLevel/providers/mapillary/decode.js');
|
||||
const now = Date.UTC(2026, 9, 1);
|
||||
const street = decodeCoverageTile(fixtureTile(14, 2662, 6286, now), {
|
||||
x: 2662,
|
||||
y: 6286,
|
||||
z: 14,
|
||||
});
|
||||
assert.equal(street.sequences.length, 8);
|
||||
const pano = street.sequences.filter((s) => s.isPano).length;
|
||||
assert.ok(pano > 0 && pano < 8, '360° and flat both present');
|
||||
const year = 365 * 86_400_000;
|
||||
const old = street.sequences.filter((s) => now - s.capturedAt > year).length;
|
||||
assert.ok(old > 0 && old < 8, 'recent and older both present');
|
||||
const orbit = decodeCoverageTile(fixtureTile(3, 1, 3, now), {
|
||||
x: 1,
|
||||
y: 3,
|
||||
z: 3,
|
||||
});
|
||||
assert.ok(orbit.overview.length > 0, 'overview points from orbit');
|
||||
assert.equal(fixtureTile(8, 1, 1, now).length, 0, 'nothing in between');
|
||||
});
|
||||
Reference in new issue
Block a user