UNPKG

@freelancercom/blue-harvest

Version:
115 lines (113 loc) 5.51 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeMask = exports.addMask = exports.compareScreenshot = void 0; const fs = require("fs"); const os = require("os"); const path = require("path"); const looksSame = require("looks-same"); const protractor_1 = require("protractor"); let mask_fn = require('./mask').MASK_FN; /** * Compare a screenshot to a reference, or "golden" image. * Returns a Promise that resolves to whether or not the * screenshot is a match. If the UPDATE_SCREENSHOTS environment * variable is set, the promise resolves to true and the * golden image is updated. * * @param data - The screenshot image data. * @param golden - The path to the golden image to compare to. * @param outputFolder - The destination path for saving the diff. if it is not provided, the difference image will not be * saved. */ function compareScreenshot(data, golden, outputFolder = undefined, looksSameOptions = {}) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { const tempFolder = createTempFolder(); const screenshotPath = yield writeScreenshot(tempFolder, data); // check if goldens need to be updated const update = process.env['UPDATE_GOLDENS'] === '1' || process.env['UPDATE_GOLDENS'] === 'true'; if (update && !fs.existsSync(golden)) { fs.writeFileSync(golden, fs.readFileSync(screenshotPath)); resolve('Reference image ' + golden + ' was successfully updated.'); return; } const goldenName = path.basename(golden); looksSame(screenshotPath, golden, Object.assign({ strict: false, tolerance: 5.0, }, looksSameOptions), (error, equal) => __awaiter(this, void 0, void 0, function* () { if (error) { reject("There has been an error. Error: " + error); return; } if (!equal) { if (update) { fs.writeFileSync(golden, fs.readFileSync(screenshotPath)); resolve('Reference image ' + golden + ' was successfully updated.'); } else if (outputFolder) { const diffPath = path.join(outputFolder, `diff-${goldenName}`); looksSame.createDiff({ reference: golden, current: screenshotPath, diff: diffPath, highlightColor: '#ff00ff', // color to highlight the differences }, (err) => { if (err) { reject('An error occurred while saving the diff image: ' + err); return; } const currentPath = path.join(outputFolder, `current-${goldenName}`); fs.writeFileSync(currentPath, fs.readFileSync(screenshotPath)); reject(`Screenshot ${currentPath} do not match for ${golden}. Difference picture is saved as ${diffPath}.`); }); } else { reject(`Screenshots do not match for ${golden}.`); } } else { resolve('The test passed. '); } })); })); }); } exports.compareScreenshot = compareScreenshot; function createTempFolder() { return fs.mkdtempSync(`${os.tmpdir()}${path.sep}`); } /** * Write a screenshot to disk in a new temporary path. */ function writeScreenshot(folder, data) { return __awaiter(this, void 0, void 0, function* () { let screenshotFile = path.join(folder, 'new.png'); fs.writeFileSync(screenshotFile, data, 'base64'); return screenshotFile; }); } function addMask(el, color, zIndex = 10000, xOffset = 0, yOffset = 0, sizeMultiplier = 1.0) { return __awaiter(this, void 0, void 0, function* () { let rect = yield el.getRect(); const mask = yield protractor_1.browser.executeScript(mask_fn, rect.x + xOffset, rect.y + yOffset, rect.width * sizeMultiplier, rect.height * sizeMultiplier, color, zIndex); return mask; }); } exports.addMask = addMask; function removeMask(mask) { return __awaiter(this, void 0, void 0, function* () { yield protractor_1.browser.executeScript("arguments[0].parentNode.removeChild(arguments[0])", mask); }); } exports.removeMask = removeMask; //# sourceMappingURL=screenshot_helper.js.map