approvals
Version:
Approval Tests Library - Capturing Human Intelligence
79 lines (78 loc) • 3.82 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileApprover = void 0;
exports.verify = verify;
const fs_1 = __importDefault(require("fs"));
const ConsoleUtils_1 = require("./Utilities/ConsoleUtils");
const ApprovedFileLog_1 = require("./Logs/ApprovedFileLog");
const FailedFileLog_1 = require("./Logs/FailedFileLog");
function normalizeLineEndings(value) {
return value.replace(/(?:\r\n|\r|\n)/g, "\n");
}
class FileApprover {
static verify(namer, writer, reporterFactory, options) {
if (!namer || !writer || !reporterFactory) {
throw new Error("Missing required arguments: 'namer', 'writer', or 'reporterFactory'.");
}
if (!options) {
options = {};
}
const approvedFileName = namer.getApprovedFile(writer.getFileExtension());
const receivedFileName = namer.getReceivedFile(writer.getFileExtension());
FailedFileLog_1.FailedFileLog.touch();
ApprovedFileLog_1.ApprovedFileLog.log(approvedFileName);
writer.write(receivedFileName);
if (options.forceApproveAll) {
console.log((0, ConsoleUtils_1.yellowText)(`WARNING: Force approving: ${approvedFileName}`));
writer.write(approvedFileName);
}
const selectFirstCompatibleReporter = () => {
const allReporters = reporterFactory();
const reporter = allReporters.find((reporter) => reporter.canReportOn(receivedFileName));
if (!reporter) {
throw new Error(`No compatible reporter found in configured list [${allReporters.map((r) => r.name).join(", ")}] for: ${receivedFileName}`);
}
return reporter;
};
const throwReporterError = (msg) => {
FailedFileLog_1.FailedFileLog.log(approvedFileName, receivedFileName);
const reporter = selectFirstCompatibleReporter();
try {
reporter.report(approvedFileName, receivedFileName, options);
}
catch (ex) {
const reporterError = `Error raised by reporter [${reporter.name}]: ${ex}`;
throw new Error(`${reporterError}\n${msg}\nApproved: ${approvedFileName}\nReceived: ${receivedFileName}`);
}
throw new Error(msg);
};
if (!fs_1.default.existsSync(approvedFileName)) {
throwReporterError(`Approved file does not exist: ${approvedFileName}`);
}
let approvedFileContents = fs_1.default.readFileSync(approvedFileName, "utf8") || "";
let receivedFileContents = fs_1.default.readFileSync(receivedFileName, "utf8") || "";
if (options.stripBOM) {
approvedFileContents = approvedFileContents.replace(/^\uFEFF/, "");
receivedFileContents = receivedFileContents.replace(/^\uFEFF/, "");
}
if (options.failOnLineEndingDifferences &&
approvedFileContents !== receivedFileContents) {
throwReporterError("Files do not match.");
}
const approvedFileBufferNormalized = normalizeLineEndings(approvedFileContents);
const receivedFileBufferNormalized = normalizeLineEndings(receivedFileContents);
if (approvedFileBufferNormalized !== receivedFileBufferNormalized) {
throwReporterError("Files do not match.");
}
// Delete the received file
fs_1.default.unlinkSync(receivedFileName);
process.emit("approvalFileApproved", approvedFileName);
}
}
exports.FileApprover = FileApprover;
function verify(namer, writer, reporterFactory, options) {
FileApprover.verify(namer, writer, reporterFactory, options);
}