This commit is contained in:
Andras Schmelczer 2026-05-13 12:11:54 +01:00
parent a08b5d2ae0
commit b98f0e3904
38 changed files with 3732 additions and 483 deletions

View file

@ -16,8 +16,17 @@ test('buildScreenshotRequest accepts supported screenshot parameters', () => {
crime: ['Burglary (avg/yr):0:5', 'Vehicle crime (avg/yr):0:10'],
voteShare: ['% Labour:30:55', '% Conservative:10:35'],
ethnicity: ['% White:10:80', '% South Asian:5:35'],
amenityDistance: [
'Distance%20to%20nearest%20amenity%20(Park)%20(km):0:0.4',
'Distance%20to%20nearest%20amenity%20(Caf%C3%A9)%20(km):0:1.5',
],
transportDistance: 'Distance%20to%20nearest%20amenity%20(Bus%20stop)%20(km):0:0.3',
amenityCount2km: 'Number%20of%20amenities%20(Cafe)%20within%202km:2:8',
amenityCount5km: 'Number%20of%20amenities%20(Park)%20within%205km:1:20',
poi: 'supermarket',
tt: 'transit:kings-cross:Kings Cross:b:0:30',
share: 'abc123',
pc: 'SW1A 1AA',
});
assert.equal(result.pagePath, '/invite/abc123');
@ -36,6 +45,31 @@ test('buildScreenshotRequest accepts supported screenshot parameters', () => {
]);
assert.deepEqual(result.qs.getAll('voteShare'), ['% Labour:30:55', '% Conservative:10:35']);
assert.deepEqual(result.qs.getAll('ethnicity'), ['% White:10:80', '% South Asian:5:35']);
assert.deepEqual(result.qs.getAll('amenityDistance'), [
'Distance%20to%20nearest%20amenity%20(Park)%20(km):0:0.4',
'Distance%20to%20nearest%20amenity%20(Caf%C3%A9)%20(km):0:1.5',
]);
assert.deepEqual(result.qs.getAll('transportDistance'), [
'Distance%20to%20nearest%20amenity%20(Bus%20stop)%20(km):0:0.3',
]);
assert.deepEqual(result.qs.getAll('amenityCount2km'), [
'Number%20of%20amenities%20(Cafe)%20within%202km:2:8',
]);
assert.deepEqual(result.qs.getAll('amenityCount5km'), [
'Number%20of%20amenities%20(Park)%20within%205km:1:20',
]);
assert.equal(result.qs.get('share'), 'abc123');
assert.equal(result.qs.get('pc'), 'SW1A 1AA');
});
test('buildScreenshotRequest safely passes through future dashboard parameters', () => {
const result = buildScreenshotRequest({
futureFilter: ['alpha:1:2', 'beta:3:4'],
viewMode_2: 'postcode',
});
assert.deepEqual(result.qs.getAll('futureFilter'), ['alpha:1:2', 'beta:3:4']);
assert.equal(result.qs.get('viewMode_2'), 'postcode');
});
test('buildScreenshotRequest rejects invalid numeric values', () => {
@ -67,3 +101,12 @@ test('buildScreenshotRequest limits repeated parameters', () => {
test('buildScreenshotRequest rejects control characters', () => {
assert.throws(() => buildScreenshotRequest({ filter: 'Feature:\u0000:1' }), ValidationError);
});
test('buildScreenshotRequest rejects reserved screenshot service parameters', () => {
assert.throws(() => buildScreenshotRequest({ screenshot: '0' }), ValidationError);
assert.throws(() => buildScreenshotRequest({ _auth: '1' }), ValidationError);
});
test('buildScreenshotRequest rejects unsafe passthrough parameter names', () => {
assert.throws(() => buildScreenshotRequest({ 'filter[]': 'Feature:0:1' }), ValidationError);
});