@pdfme/generator
Version:
TypeScript base PDF generator and React base UI. Open source, developed by the community, and completely free to use under the MIT license!
277 lines • 12.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const generate_js_1 = __importDefault(require("../src/generate.js"));
const common_1 = require("@pdfme/common");
const utils_js_1 = require("./utils.js");
require("jest-image-snapshot");
describe('generate integrate test', () => {
describe('basic generator', () => {
const textObject = (x, y, name = 'a') => ({
name,
type: 'text',
content: '',
position: { x, y },
width: 100,
height: 100,
fontSize: 13,
});
const singleSchemaTemplate = {
basePdf: common_1.BLANK_PDF,
schemas: [[textObject(0, 0), textObject(25, 25, 'b')]],
};
const multiSchemasTemplate = {
basePdf: 'data:application/pdf;base64,JVBERi0xLjcNJeLjz9MNCjYgMCBvYmoNPDwvTGluZWFyaXplZCAxL0wgMTg0NC9PIDgvRSAxMTEwL04gMi9UIDE1NzAvSCBbIDQyMyAxMzFdPj4NZW5kb2JqDSAgICAgICAgICAgICAgICAgICAgICAgDQoxMSAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgMy9QcmVkaWN0b3IgMTI+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvSURbPEJBMTk5MUY0MThCN0IyMTEwQTAwNjc0NThCNkJDNjIzPjxGOEE4OEZEMzMzNjQ2OTQ2QkE1ODMzM0M4MEFEMDFFNj5dL0luZGV4WzYgN10vTGVuZ3RoIDM2L1ByZXYgMTU3MS9Sb290IDcgMCBSL1NpemUgMTMvVHlwZS9YUmVmL1dbMSAyIDBdPj5zdHJlYW0NCmjeYmJkEGBiYJJiYmDQZWJgvA+k45gY/j4Aso0BAgwAISQDuA0KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYNCjANCiUlRU9GDQogICAgICAgIA0KMTIgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA1Ny9TIDQ0Pj5zdHJlYW0NCmjeYmBgYGJgYLzCwAgkbRk4GBCAAyjGxMDCwNFwiOGAQvkhJCkGZihmYIhj4GhkSGEACDAAvy4F4g0KZW5kc3RyZWFtDWVuZG9iag03IDAgb2JqDTw8L1BhZ2VzIDUgMCBSL1R5cGUvQ2F0YWxvZz4+DWVuZG9iag04IDAgb2JqDTw8L0Fubm90c1tdL0JsZWVkQm94WzAgMCA1OTUuNDQgODQxLjkyXS9Db250ZW50cyA5IDAgUi9Dcm9wQm94WzAgMCA1OTUuNDQgODQxLjkyXS9NZWRpYUJveFswIDAgNTk1LjQ0IDg0MS45Ml0vUGFyZW50IDUgMCBSL1Jlc291cmNlczw8L1hPYmplY3Q8PC9GbTAgMTAgMCBSPj4+Pi9Sb3RhdGUgMC9UcmltQm94WzAgMCA1OTUuNDQgODQxLjkyXS9UeXBlL1BhZ2U+Pg1lbmRvYmoNOSAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI2Pj5zdHJlYW0NCkiJKlQwUAjx0XfLNVBwyVcIVAAIMAAiagP4DQplbmRzdHJlYW0NZW5kb2JqDTEwIDAgb2JqDTw8L0JCb3hbMzI3NjguMCAzMjc2OC4wIC0zMjc2OC4wIC0zMjc2OC4wXS9GaWx0ZXIvRmxhdGVEZWNvZGUvRm9ybVR5cGUgMS9MZW5ndGggMTQvTWF0cml4WzEgMCAwIDEgMCAwXS9SZXNvdXJjZXM8PD4+L1N1YnR5cGUvRm9ybS9UeXBlL1hPYmplY3Q+PnN0cmVhbQ0KSIkq5ArkAggwAAKSANcNCmVuZHN0cmVhbQ1lbmRvYmoNMSAwIG9iag08PC9Bbm5vdHNbXS9CbGVlZEJveFswIDAgNTk1LjQ0IDg0MS45Ml0vQ29udGVudHMgMiAwIFIvQ3JvcEJveFswIDAgNTk1LjQ0IDg0MS45Ml0vTWVkaWFCb3hbMCAwIDU5NS40NCA4NDEuOTJdL1BhcmVudCA1IDAgUi9SZXNvdXJjZXM8PC9YT2JqZWN0PDwvRm0wIDEwIDAgUj4+Pj4vUm90YXRlIDAvVHJpbUJveFswIDAgNTk1LjQ0IDg0MS45Ml0vVHlwZS9QYWdlPj4NZW5kb2JqDTIgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyNj4+c3RyZWFtDQpIiSpUMFAI8dF3yzVQcMlXCFQACDAAImoD+A0KZW5kc3RyZWFtDWVuZG9iag0zIDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJzdCA0L0xlbmd0aCA1Mi9OIDEvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN4yVTBQsLHRd84vzStRMNL3zkwpjrYAigUpGILIWP2QyoJU/YDE9NRiOzuAAAMAETgMkw0KZW5kc3RyZWFtDWVuZG9iag00IDAgb2JqDTw8L0RlY29kZVBhcm1zPDwvQ29sdW1ucyAzL1ByZWRpY3RvciAxMj4+L0ZpbHRlci9GbGF0ZURlY29kZS9JRFs8QkExOTkxRjQxOEI3QjIxMTBBMDA2NzQ1OEI2QkM2MjM+PEY4QTg4RkQzMzM2NDY5NDZCQTU4MzMzQzgwQUQwMUU2Pl0vTGVuZ3RoIDMzL1Jvb3QgNyAwIFIvU2l6ZSA2L1R5cGUvWFJlZi9XWzEgMiAwXT4+c3RyZWFtDQpo3mJiYGBgYmQJY2JgvM/EwBAHpCcwMf56ABBgABstBBINCmVuZHN0cmVhbQ1lbmRvYmoNc3RhcnR4cmVmDQoxMTYNCiUlRU9GDQo=',
schemas: [[textObject(0, 0)], [textObject(25, 25, 'b')]],
};
const singleInputs = [{ a: 'a', b: 'b' }];
const multiInputs = [
{ a: 'a-1', b: 'b-1' },
{ a: 'a-2', b: 'b-2' },
];
const testCases = [
{
template: singleSchemaTemplate,
inputs: singleInputs,
testName: 'singleSchemaTemplate with singleInputs',
},
{
template: singleSchemaTemplate,
inputs: multiInputs,
testName: 'singleSchemaTemplate with multiInputs',
},
{
template: multiSchemasTemplate,
inputs: singleInputs,
testName: 'multiSchemasTemplate with singleInputs',
},
{
template: multiSchemasTemplate,
inputs: multiInputs,
testName: 'multiSchemasTemplate with multiInputs',
},
];
// testCases for
for (let i = 0; i < testCases.length; i += 1) {
const { template, inputs, testName } = testCases[i];
test(testName, async () => {
const pdf = await (0, generate_js_1.default)({ inputs, template });
const images = await (0, utils_js_1.pdfToImages)(pdf);
for (let i = 0; i < images.length; i++) {
expect(images[i]).toMatchImageSnapshot({
customSnapshotIdentifier: `${testName}-${i + 1}`,
});
}
});
}
});
describe('use fontColor template', () => {
test(`sample`, async () => {
const inputs = [{ name: 'here is purple color' }];
const template = {
basePdf: common_1.BLANK_PDF,
schemas: [
[
{
name: 'name',
type: 'text',
content: '',
position: { x: 30, y: 30 },
width: 100,
height: 20,
fontColor: '#7d2ae8',
},
],
],
};
const pdf = await (0, generate_js_1.default)({ inputs, template });
const images = await (0, utils_js_1.pdfToImages)(pdf);
for (let i = 0; i < images.length; i++) {
expect(images[i]).toMatchImageSnapshot({
customSnapshotIdentifier: `fontColor-${i + 1}`,
});
}
});
});
describe('use fontSubset template', () => {
test(`sample`, async () => {
const inputs = [{ field1: 'NotoSansJP', field2: 'NotoSerifJP' }];
const template = {
basePdf: common_1.BLANK_PDF,
schemas: [
[
{
name: 'field1',
type: 'text',
content: '',
position: { x: 30, y: 30 },
width: 100,
height: 20,
fontName: 'NotoSansJP',
},
{
name: 'field2',
type: 'text',
content: '',
position: { x: 60, y: 60 },
width: 100,
height: 20,
fontName: 'NotoSerifJP',
},
],
],
};
const font = (0, utils_js_1.getFont)();
const pdf = await (0, generate_js_1.default)({
inputs,
template,
options: {
font: {
NotoSansJP: {
...font.NotoSansJP,
fallback: true,
subset: false,
},
NotoSerifJP: {
...font.NotoSerifJP,
subset: false,
},
},
},
});
const images = await (0, utils_js_1.pdfToImages)(pdf);
for (let i = 0; i < images.length; i++) {
expect(images[i]).toMatchImageSnapshot({
customSnapshotIdentifier: `fontSubset-${i + 1}`,
});
}
}, 10000);
});
});
describe('check validation', () => {
test(`inputs length is 0`, async () => {
const inputs = [];
const template = {
basePdf: common_1.BLANK_PDF,
schemas: [
[
{
name: 'a',
type: 'text',
content: '',
position: { x: 0, y: 0 },
width: 100,
height: 100,
},
],
],
};
try {
await (0, generate_js_1.default)({ inputs, template, options: { font: (0, utils_js_1.getFont)() } });
fail();
}
catch (e) {
expect(e.message).toEqual(`[@pdfme/common] Invalid argument:
--------------------------
ERROR POSITION: inputs
ERROR MESSAGE: Array must contain at least 1 element(s)
--------------------------`);
}
});
test(`missing fallback font`, async () => {
const inputs = [{ a: 'test' }];
const template = {
basePdf: common_1.BLANK_PDF,
schemas: [
[
{
name: 'a',
type: 'text',
content: '',
position: { x: 0, y: 0 },
width: 100,
height: 100,
},
],
],
};
const font = (0, utils_js_1.getFont)();
font.Roboto.fallback = false;
try {
await (0, generate_js_1.default)({ inputs, template, options: { font } });
fail();
}
catch (e) {
expect(e.message).toEqual(`[@pdfme/common] fallback flag is not found in font. true fallback flag must be only one.
Check this document: https://pdfme.com/docs/custom-fonts#about-font-type`);
}
});
test(`too many fallback font`, async () => {
const inputs = [{ a: 'test' }];
const template = {
basePdf: common_1.BLANK_PDF,
schemas: [
[
{
name: 'a',
type: 'text',
content: '',
position: { x: 0, y: 0 },
width: 100,
height: 100,
},
],
],
};
const font = (0, utils_js_1.getFont)();
// Set multiple fonts to have fallback = true to test the error
font.Roboto.fallback = true;
font.NotoSansJP = { ...font.NotoSansJP, fallback: true };
try {
await (0, generate_js_1.default)({ inputs, template, options: { font } });
fail();
}
catch (e) {
expect(e.message).toEqual(`[@pdfme/common] 2 fallback flags found in font. true fallback flag must be only one.
Check this document: https://pdfme.com/docs/custom-fonts#about-font-type`);
}
});
test(`missing font in template.schemas`, async () => {
const inputs = [{ a: 'test' }];
const template = {
basePdf: common_1.BLANK_PDF,
schemas: [
[
{
name: 'a',
type: 'text',
content: '',
fontName: 'DUMMY_FONT',
position: { x: 0, y: 0 },
width: 100,
height: 100,
},
{
name: 'b',
type: 'text',
content: '',
position: { x: 0, y: 0 },
width: 100,
height: 100,
},
],
],
};
try {
await (0, generate_js_1.default)({ inputs, template, options: { font: (0, utils_js_1.getFont)() } });
fail();
}
catch (e) {
expect(e.message).toEqual(`[@pdfme/common] DUMMY_FONT of template.schemas is not found in font.
Check this document: https://pdfme.com/docs/custom-fonts`);
}
});
});
//# sourceMappingURL=generate.test.js.map