DEV Community

Cover image for Running a postman collection with newman alongside plugins (newman-reporter-htmlextra | pdf-export | pdf-parse)
Kiril Delovski
Kiril Delovski

Posted on

7 3

Running a postman collection with newman alongside plugins (newman-reporter-htmlextra | pdf-export | pdf-parse)

This guide is for running a collection of api tests, generating html report of results and generating pdf file from the API body response (the pdfData) from base64 encoded string.

What is covered with this tutorial:
1) Running postman collection with newman.
2) Custom environment location with newman.
3) Reporter-htmlextra with custom template location to export the test result report.
4) PDF Export - get the response object search for binary encoded pdf string, generate decoded pdf file and place it with the report.html file in a newly created folder by current date.
5) PDF Parse - the generated pdf file - access it and search for specific metadata or custom text content or string from that pdf.

We may start now: 👀
Let's assume you already have a postman collection of requests and the next step is to export that collection.json file in the specific directory where the following steps are needed.

Requirements:
1) Postman application installed (for exporting the collection)
2) NodeJs installed (https://nodejs.org/en/download/)

Setup:
1) Setup a local path on your pc and inside project directory open terminal/cmd and do command npm init

  • this will generate the package.json file.

2) Install newman npm i newman --save-dev
3) Install newman-reporter-htmlextra npm i newman-reporter-htmlextra --save-dev
4) Install pdf-parse npm i pdf-parse --save-dev
5) Install date formatter npm i dateformat@1.0.2-1.2.3 --save-dev
6) Create index.js file in the root project and let's start filling it with code.



const dateFormat = require('./node_modules/dateformat/lib/dateformat.js');
const fs = require('fs');
const now = new Date();
const currentData = dateFormat(now, "dd.mm.yyyy HH.MM");
const newman = require('newman');
// add the path to your exported postman collection
const collection = require('./Newman.postman_collection.json');
const reportName = 'report.html';

newman.run({
    collection,
    // if you use environments from different json file excluded from the postman collection, otherwise comment it
    environment: `./environment/dev.json`,
    reporters: ['cli', 'htmlextra'],
    iterationCount: 1,
    reporter: {
        htmlextra: {
            // commented lines are the all possibilities available to be set for the report document
            export: `./${currentData}/${reportName}`,
            /*
            this is the original location of the template but can be copied modified, moved and linked to it
            if you don't specify template path will use the default one ./node_modules/newman-reporter-htmlextra/lib/dashboard-template.hbs
            */
            template: './node_modules/newman-reporter-htmlextra/lib/dashboard-template.hbs',
            // logs: true,
            // showOnlyFails: true,
            // noSyntaxHighlighting: true,
            // testPaging: true,
            browserTitle: "Newman report",
            title: 'Report - ' + currentData,
            titleSize: 5,
            // omitHeaders: true,
            // skipHeaders: "Authorization",
            // omitRequestBodies: true,
            // omitResponseBodies: true,
            // hideRequestBody: ["Login"],
            // hideResponseBody: ["Auth Request"],
            showEnvironmentData: true,
            // skipEnvironmentVars: ["API_KEY"],
            // showGlobalData: true,
            // skipGlobalVars: ["API_TOKEN"],
            // skipSensitiveData: true,
            // showMarkdownLinks: true,
            showFolderDescription: true,
            // timezone: "Australia/Sydney",
            // skipFolders: "folder name with space,folderWithoutSpace",
            // skipRequests: "request name with space,requestNameWithoutSpace",
            // displayProgressBar: true
        }
    }
}).on('request', (error, data) => {
    const requestName = data.item.name;
    const fileName = `${requestName}.pdf`;
    let content = data.response.stream.toString();

    /* You need to modify this in order to get the specific
 data of encoded string from your API response */
    let pdfEncodedString = JSON.parse(content).pdfData;

    if (error) {
        console.log(error);
        return;
    }

    if (JSON.parse(content).message === 'Forbidden') {
        console.log('There has been error. Get renewed access token!');
        return;
    }

    if (pdfEncodedString !== undefined) {

        if (!fs.existsSync(currentData)) fs.mkdirSync(currentData, { recursive: true });

        fs.writeFile(currentData + '/' + fileName, pdfEncodedString, 'base64', function (error) {
            if (error) {
                console.error(error);
            } else {
                const pdf = require('pdf-parse');
                let dataBuffer = fs.readFileSync(currentData + '/' + fileName);
                pdf(dataBuffer).then(function (data) {
                    /*  number of pages    
                    console.log(data.numpages);     
                    //number of rendered pages    
                    console.log(data.numrender);     
                    //PDF info    
                    console.log(data.info);     
                    //PDF metadata    
                    console.log(data.metadata);      
                    //PDF.js version     
                    check https://mozilla.github.io/pdf.js/getting_started/    
                    console.log(data.version);     PDF text    console.log(data.text);
                    */
                    console.log('Content: ', data.text);
                    console.log('Specific word: ', data.text.includes('some_text_you_want_to_find'));  // you can use any js logic here or regex
                    console.log('number of pages:', data.numpages);
                    console.log('number of rendered pages:', data.numrender);
                    console.log(data.info);
                });
            }
        });
    } else {
        console.log('Pdf encoded string not found in the body response')
    }
});



Enter fullscreen mode Exit fullscreen mode

7) Running the script with the command node . inside the terminal window of the project root

  • After command finishes the tests will be generated in a new folder by current date and time inside the root of project:
    • If some test fails then will be no visible pdf file in the folder.

For any questions or information about me you can reach out by scanning or clicking on the following qr code:



scan qr code to find more about me

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (1)

Collapse
 
kiril6 profile image
Kiril Delovski •

Looking to excel in your JavaScript interviews? Check out this comprehensive article: JavaScript Interview Cheat Sheet Manual.

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →