Skip to content

Commit 5d3f472

Browse files
committed
report: fix compat for older lighthouse reports
1 parent 994b9bf commit 5d3f472

File tree

10 files changed

+29067
-11
lines changed

10 files changed

+29067
-11
lines changed

core/util.cjs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ class Util {
154154
}
155155
}
156156
}
157+
158+
// TODO: convert printf-style displayValue.
159+
// Added: #5099, v3
160+
// Removed: #6767, v4
157161
}
158162
}
159163

@@ -216,6 +220,20 @@ class Util {
216220
});
217221
}
218222

223+
// Add some minimal stuff so older reports still work.
224+
if (!clone.environment) {
225+
// @ts-expect-error
226+
clone.environment = {benchmarkIndex: 0};
227+
}
228+
if (!clone.configSettings.screenEmulation) {
229+
// @ts-expect-error
230+
clone.configSettings.screenEmulation = {};
231+
}
232+
if (!clone.i18n) {
233+
// @ts-expect-error
234+
clone.i18n = {};
235+
}
236+
219237
return clone;
220238
}
221239

report/renderer/util.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ class Util {
150150
}
151151
}
152152
}
153+
154+
// TODO: convert printf-style displayValue.
155+
// Added: #5099, v3
156+
// Removed: #6767, v4
153157
}
154158
}
155159

@@ -212,6 +216,20 @@ class Util {
212216
});
213217
}
214218

219+
// Add some minimal stuff so older reports still work.
220+
if (!clone.environment) {
221+
// @ts-expect-error
222+
clone.environment = {benchmarkIndex: 0};
223+
}
224+
if (!clone.configSettings.screenEmulation) {
225+
// @ts-expect-error
226+
clone.configSettings.screenEmulation = {};
227+
}
228+
if (!clone.i18n) {
229+
// @ts-expect-error
230+
clone.i18n = {};
231+
}
232+
215233
return clone;
216234
}
217235

report/test-assets/lhr-3.0.0.json

Lines changed: 2332 additions & 0 deletions
Large diffs are not rendered by default.

report/test-assets/lhr-4.3.0.json

Lines changed: 4754 additions & 0 deletions
Large diffs are not rendered by default.

report/test-assets/lhr-5.0.0.json

Lines changed: 5994 additions & 0 deletions
Large diffs are not rendered by default.

report/test-assets/lhr-6.0.0.json

Lines changed: 7222 additions & 0 deletions
Large diffs are not rendered by default.

report/test-assets/lhr-8.5.0.json

Lines changed: 8679 additions & 0 deletions
Large diffs are not rendered by default.

report/test/renderer/report-renderer-test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ import {CategoryRenderer} from '../../renderer/category-renderer.js';
1616
import {ReportRenderer} from '../../renderer/report-renderer.js';
1717
import {readJson} from '../../../core/test/test-utils.js';
1818

19-
const sampleResultsOrig = readJson('../../../core/test/results/sample_v2.json', import.meta);
19+
// const sampleResultsOrig = readJson('../../../core/test/results/sample_v2.json', import.meta);
20+
// const oldSampleResultsOrig = readJson('../test-assets/lhr-3.0.0.json', import.meta);
21+
22+
const sampleResultsOrig = readJson('../../test-assets/lhr-3.0.0.json', import.meta);
2023

2124
const TIMESTAMP_REGEX = /\d+, \d{4}.*\d+:\d+/;
2225

viewer/app/src/lighthouse-report-viewer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ export class LighthouseReportViewer {
340340
} catch (err) {
341341
logger.error(err.message);
342342
}
343+
344+
document.dispatchEvent(new CustomEvent('lh-file-upload-test-ack'));
343345
}
344346

345347
/**

viewer/test/viewer-test-pptr.js

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import fs from 'fs';
88
import assert from 'assert/strict';
99

1010
import puppeteer from 'puppeteer';
11+
import {expect} from 'expect';
1112

1213
import {Server} from '../../cli/test/fixtures/static-server.js';
1314
import defaultConfig from '../../core/config/default-config.js';
@@ -32,7 +33,7 @@ describe('Lighthouse Viewer', () => {
3233
let browser;
3334
/** @type {import('puppeteer').Page} */
3435
let viewerPage;
35-
const pageErrors = [];
36+
let pageErrors = [];
3637

3738
const selectors = {
3839
audits: '.lh-audit, .lh-metric',
@@ -69,16 +70,29 @@ describe('Lighthouse Viewer', () => {
6970
});
7071

7172
after(async function() {
72-
// Log any page load errors encountered in case before() failed.
73-
// eslint-disable-next-line no-console
74-
if (pageErrors.length > 0) console.error(pageErrors);
75-
7673
await Promise.all([
7774
server.close(),
7875
browser && browser.close(),
7976
]);
8077
});
8178

79+
beforeEach(async function() {
80+
pageErrors = [];
81+
});
82+
83+
async function ensureNoErrors() {
84+
await viewerPage.evaluate(() => new Promise(window.requestAnimationFrame));
85+
const theErrors = pageErrors;
86+
pageErrors = [];
87+
expect(theErrors).toHaveLength(0);
88+
}
89+
90+
afterEach(async function() {
91+
// Tests should call this themselves so the failure is associated with them in the test report,
92+
// but just in case one is missed it won't hurt to repeat the check here.
93+
await ensureNoErrors();
94+
});
95+
8296
describe('Renders the flow report', () => {
8397
before(async () => {
8498
await viewerPage.goto(viewerUrl, {waitUntil: 'networkidle2', timeout: 30000});
@@ -88,7 +102,7 @@ describe('Lighthouse Viewer', () => {
88102
});
89103

90104
it('should load with no errors', async () => {
91-
assert.deepStrictEqual(pageErrors, []);
105+
await ensureNoErrors();
92106
});
93107

94108
it('renders the summary page', async () => {
@@ -100,7 +114,7 @@ describe('Lighthouse Viewer', () => {
100114
);
101115
assert.equal(scores.length, 14);
102116

103-
assert.deepStrictEqual(pageErrors, []);
117+
await ensureNoErrors();
104118
});
105119
});
106120

@@ -113,7 +127,7 @@ describe('Lighthouse Viewer', () => {
113127
});
114128

115129
it('should load with no errors', async () => {
116-
assert.deepStrictEqual(pageErrors, []);
130+
await ensureNoErrors();
117131
});
118132

119133
it('should contain all categories', async () => {
@@ -251,6 +265,25 @@ describe('Lighthouse Viewer', () => {
251265
});
252266
});
253267

268+
describe('Renders old reports', () => {
269+
[
270+
'lhr-3.0.0.json',
271+
'lhr-4.3.0.json',
272+
'lhr-5.0.0.json',
273+
'lhr-6.0.0.json',
274+
'lhr-8.5.0.json',
275+
].forEach((testFilename) => {
276+
it(`[${testFilename}] should load with no errors`, async () => {
277+
await viewerPage.goto(viewerUrl, {waitUntil: 'networkidle2', timeout: 30000});
278+
const fileInput = await viewerPage.$('#hidden-file-input');
279+
await fileInput.uploadFile(`${LH_ROOT}/report/test-assets/${testFilename}`);
280+
await viewerPage.evaluate(() =>
281+
document.addEventListener('lh-file-upload-test-ack', {once: true}));
282+
await ensureNoErrors();
283+
});
284+
});
285+
});
286+
254287
describe('PSI', () => {
255288
/** @type {Partial<puppeteer.ResponseForRequest>} */
256289
let interceptedRequest;
@@ -351,7 +384,7 @@ describe('Lighthouse Viewer', () => {
351384
expect(interceptedUrl.searchParams.getAll('category').sort()).toEqual(defaultCategories);
352385

353386
// No errors.
354-
assert.deepStrictEqual(pageErrors, []);
387+
await ensureNoErrors();
355388

356389
// All categories.
357390
const categoryElementIds = await getCategoryElementsIds();
@@ -395,7 +428,7 @@ describe('Lighthouse Viewer', () => {
395428
});
396429

397430
// No errors.
398-
assert.deepStrictEqual(pageErrors, []);
431+
await ensureNoErrors();
399432
});
400433

401434
it('should handle errors from the API', async () => {
@@ -412,6 +445,7 @@ describe('Lighthouse Viewer', () => {
412445
// One error.
413446
expect(pageErrors).toHaveLength(1);
414447
expect(pageErrors[0].message).toContain('badPsiResponse error');
448+
pageErrors = [];
415449
});
416450
});
417451
});

0 commit comments

Comments
 (0)