visreg-test
Version:
A visual regression testing solution that offers an easy setup with simple yet powerful customisation options, wrapped up in a convenient CLI runner to make assessing and accepting/rejecting diffs a breeze.
85 lines (84 loc) • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const local_cypress_1 = require("local-cypress");
require("cypress-set-device-pixel-ratio");
require("cypress-network-idle");
const viewportUserAgents = {
'ipad': 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A406 Safari/8536.25',
'iphone': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1',
'samsung': 'Mozilla/5.0 (Linux; Android 12; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36',
'macbook': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
};
const getHeadersWithUserAgent = (viewport, headers) => {
if (headers['User-Agent']) {
return headers;
}
if (Array.isArray(viewport)) {
return headers;
}
const viewportUserAgent = Object
.keys(viewportUserAgents)
.find((key) => viewport.includes(key));
if (!viewportUserAgent) {
return headers;
}
return Object.assign(Object.assign({}, headers), { 'User-Agent': viewportUserAgents[viewportUserAgent] });
};
local_cypress_1.Cypress.Commands.add('prepareForCapture', (props) => {
var _a;
const { context, onVisit, globalOnVisit } = props;
const { fullUrl, viewport, fullPageCapture, visitOptions, requestOptions } = context;
if (local_cypress_1.Cypress.browser.name !== 'firefox') {
// This is not supported in firefox (will always be 1)
local_cypress_1.cy.setDevicePixelRatio(visitOptions.devicePixelRatio || 1);
}
const visitSettings = {
failOnStatusCode: (_a = visitOptions.failOnStatusCode) !== null && _a !== void 0 ? _a : true,
headers: getHeadersWithUserAgent(viewport, (requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.headers) || {}),
auth: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.auth,
};
local_cypress_1.cy.setResolution(viewport);
local_cypress_1.cy.visit(fullUrl, visitSettings);
local_cypress_1.cy.get("html, body").invoke(// potentially alleviates some issues with scroll behavior
"attr", "style", "height: auto; scroll-behavior: auto;");
// Endpoint hooks take precedence over global hooks (gets it passed as a parameter if user wants to call it)
onVisit
? onVisit(local_cypress_1.cy, context, globalOnVisit)
: globalOnVisit(local_cypress_1.cy, context);
const scrollSettings = {
duration: visitOptions.scrollDuration || 750,
ensureScrollable: false,
};
if (fullPageCapture) {
local_cypress_1.cy.scrollTo('bottom', scrollSettings);
local_cypress_1.cy.scrollTo('top', scrollSettings);
if (visitOptions.waitForNetworkIdle) {
local_cypress_1.cy.waitForNetworkIdle(2000, { log: false });
}
return;
}
local_cypress_1.cy.window().then(win => {
// We scroll a little even if capture is set to viewport, to trigger any lazy loading/interscetion observer.
local_cypress_1.cy.scrollTo(0, win.innerHeight, scrollSettings);
local_cypress_1.cy.scrollTo('top', scrollSettings);
if (visitOptions.waitForNetworkIdle) {
local_cypress_1.cy.waitForNetworkIdle(2000, { log: false });
}
});
});
local_cypress_1.Cypress.Commands.add('setResolution', (viewport) => {
if (local_cypress_1.Cypress._.isArray(viewport)) {
local_cypress_1.cy.viewport(viewport[0], viewport[1]);
}
else {
local_cypress_1.cy.viewport(viewport);
}
});
local_cypress_1.Cypress.Commands.overwrite('log', (originalFn, ...message) => {
if (local_cypress_1.Cypress.config('isInteractive')) {
return originalFn(JSON.stringify(message));
}
else {
return local_cypress_1.cy.task('log', message);
}
});