var PDFDocument = require('../../lib/document').default; var PDFSecurity = require('../../lib/security').default; var CryptoJS = require('crypto-js'); var path = require('path'); var fs = require('fs'); // manual mock for PDFSecurity to ensure stored id will be the same accross different systems PDFSecurity.generateFileID = () => { return new Buffer('mocked-pdf-id'); }; PDFSecurity.generateRandomWordArray = bytes => { const words = []; for (let i = 0; i < bytes; i++) { words.push(0x00010203); } return new CryptoJS.lib.WordArray.init(words, bytes); }; function updatePdf(pdfData, testState, snapshotChanges) { const pdfDir = path.join(path.dirname(testState.testPath), '__pdfs__'); if (!fs.existsSync(pdfDir)) { fs.mkdirSync(pdfDir); } const fileRefPath = path.join(pdfDir, testState.currentTestName + '.pdf'); const fileChangesPath = fileRefPath.replace('.pdf', '[changed].pdf'); const { matched, added, unmatched, updated } = snapshotChanges; if (added || updated || (matched && !fs.existsSync(fileRefPath))) { fs.writeFileSync(fileRefPath, pdfData); } if (updated) { if (fs.existsSync(fileChangesPath)) { fs.unlinkSync(fileChangesPath); } } if (unmatched) { fs.writeFileSync(fileChangesPath, pdfData); } } function getSnapshotChanges(snapshotState) { const { matched, added, unmatched, updated } = snapshotState; return { matched, added, unmatched, updated }; } function compareSnapshotChanges(changes, previousChanges) { return Object.keys(changes).reduce((result, key) => { result[key] = changes[key] - previousChanges[key]; return result; }, {}); } function runDocTest(options, fn) { if (typeof options === 'function') { fn = options; options = {}; } if (!options.info) { options.info = {}; } options.info.CreationDate = new Date(Date.UTC(2018, 1, 1)); return new Promise(function(resolve) { var doc = new PDFDocument(options); var buffers = []; fn(doc); doc.on('data', buffers.push.bind(buffers)); doc.on('end', () => { const testState = expect.getState(); const pdfData = Buffer.concat(buffers); const previousChanges = getSnapshotChanges(testState.snapshotState); expect(pdfData.toString()).toMatchSnapshot(); const changes = getSnapshotChanges(testState.snapshotState); updatePdf( pdfData, testState, compareSnapshotChanges(changes, previousChanges) ); resolve(); }); doc.end(); }); } module.exports = { runDocTest: runDocTest };