I’m attempting to set up the below script in my test collection to enhance the flexibility of my tests. However, the utils function receives the data but the pm.sendRequest doesn’t execute. Is there a problem with my script or is this simply something not possible with the setup? I’ve attempted to move the setup into the collection post-script, folder pre- and post-scripts and even the request pre-request script. Thanks in advance for the help!
//
//***********Start of collection Pre-request script*/
//
//Note: This is an attempted workaround needed due to Newman not supporting Packages and will throw failures for pm.require()
var _ = require("lodash"),
momentJs = pm.collectionVariables.get("momentJs"),
momentTimezone = pm.collectionVariables.get("momentTimezone");
//Check if data is already present to prevent repeated calls to CDNJS
if (_.isEmpty(momentJs) || _.isEmpty(momentTimezone)) {
//Get latest moment.js version (required for moment-timezone usage)
pm.sendRequest("https://api.cdnjs.com/libraries/moment.js?fields=version", (err, res) => {
if (err) {
console.log(err);
}
//Get moment.js library and set as a collection variable
pm.sendRequest(`https://cdnjs.cloudflare.com/ajax/libs/moment.js/${res.json().version}/moment.min.js`, (error, resp) => {
if (error) {
console.log(error);
}
pm.collectionVariables.set("momentJs", resp.text())
//Get latest moment-timezone version
pm.sendRequest("https://api.cdnjs.com/libraries/moment-timezone?fields=version", (err, res) => {
if (err) {
console.log(err);
}
//Get moment-timezone library and set as a collection variable
pm.sendRequest(`https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/${res.json().version}/moment-timezone-with-data-10-year-range.min.js`, (error, resp) => {
if (error) {
console.log(error);
}
pm.collectionVariables.set("momentTimezone", resp.text())
});
});
});
});
};
//Utility function that stores mutiple functions used throughout the collection assertions
utils = {
getZoneId: (city, state) => {
const getZoneIdRequest = {
url: pm.variables.replaceIn(`{{apiEndpoint}}/${city}/${state}`),
method: 'GET',
header: {
"mockHeader1": pm.variables.replaceIn("{{mockHeader1}}"),
"mockHeader2": pm.variables.replaceIn("{{mockHeader2}}")
}
};
return new Promise((resolve, reject) => {
pm.sendRequest(getZoneIdRequest, (error, res) => {
if (error) {
reject(error);
} else {
resolve(res.json());
}
});
});
}
}
//
//***********End of collection Pre-request script*/
//
//
//***********Start of request Post-response script*/
//
var responseBody = pm.response.json();
//invoke the moment.js and moment-timezone libraries
(new Function(pm.collectionVariables.get("momentJs")))();
(new Function(pm.collectionVariables.get("momentTimezone")))();
//Make external call for extra data to use in assertion to compare with response
pm.sendRequest(`http://mock.endpoint`, (err, res) => {
var mockDataResponse = res.json();
(async () => {
try {
//Call utils function with city/state data from the mockDataResponse to narrow to the correct zoneId for moment-timezone conversion
const zoneIdResponse = await utils.getZoneId(mockDataResponse.mockObject.city, mockDataResponse.mockObject.state);
pm.test("Compare UTC", () => {
var expected = moment.tz(`${mockDataResponse.mockObject.date} ${mockDataResponse.mockObject.time}`, zoneIdResponse.zoneId).toISOString(),
actual = responseBody.mockObject.utc;
pm.expect(actual, `UTC values do not match`).to.eql(expected);
});
} catch (error) {
console.error(error);
}
})();
});
//
//***********End of request Post-response script*/
//