Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
unreleased:
new features:
- >-
GH-1530 Pass any stored referenced request metadata and root item id
to nested request resolver
fixed bugs:
- >-
GH-1529 Prevent crashes from nested request events after root request
Expand Down
3 changes: 2 additions & 1 deletion lib/runner/extensions/event.command.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,8 @@ module.exports = {

isNestedRequest = this.state.nestedRequest !== undefined,

rootItemId = isNestedRequest ? this.state.nestedRequest.rootItemId : item.id,
rootItemId = isNestedRequest && this.state.nestedRequest.rootItem ?
this.state.nestedRequest.rootItem.id : item.id,

// create copy of cursor so we don't leak script ids outside `event.command`
// and across scripts
Expand Down
5 changes: 3 additions & 2 deletions lib/runner/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,10 @@ _.assign(Runner.prototype, {
* @param {Number} [options.nestedRequest.rootCursor] - The cursor of the root request that spun up this
* nested request runner. This is recursively passed down to keep track of which execution started the chain
* and modify cursors for all nested req events for reporters built on top of postman-runtime.
* @param {Number} [options.nestedRequest.rootItemId] - The id of the root item that spawned this nested request.
* @param {Number} [options.nestedRequest.rootItem] - The root item that spawned this nested request.
* Used by vault to get consent for root request and determine whether vault access check was performed even once
* throughout the chain.
* throughout the chain. And by request resolver bridge to receive any stored metadata like name/location of
* the request being resolved
* @param {Number} [options.nestedRequest.hasVaultAccess] - Mutated and set by any nested or parent request
* to indicate whether vault access check has been performed.
* @param {Number} [options.nestedRequest.invocationCount] - The number of requests currently accummulated
Expand Down
19 changes: 17 additions & 2 deletions lib/runner/nested-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ function runNestedRequest ({ executionId, isExecutionSkipped, vaultSecrets, item
self.state.nestedRequest = _.defaults(self.state.nestedRequest || {}, {
isNestedRequest: true,
rootCursor: cursor,
rootItemId: item.id,
rootItem: item,
invocationCount: 0
});

Expand All @@ -39,8 +39,23 @@ function runNestedRequest ({ executionId, isExecutionSkipped, vaultSecrets, item
' calls have been reached for this request.'));
}

let rootRequestEventsList = self.state.nestedRequest.rootItem.events?.all?.() || [],
nestedRequestMeta = null,
context = { rootItemId: self.state.nestedRequest.rootItem.id };

for (const event of rootRequestEventsList) {
if (event.script?.requests?.[requestToRunId]) {
nestedRequestMeta = event.script.requests[requestToRunId];
break;
}
}

if (nestedRequestMeta) {
context.nestedRequestMeta = nestedRequestMeta;
}

// Should fetch the request from the consumer of postman-runtime & resolve scripts and variables
requestResolver(requestToRunId, function (err, collection) {
requestResolver(requestToRunId, context, function (err, collection) {
if (err) {
return dispatchErrorToListener(err);
}
Expand Down
86 changes: 73 additions & 13 deletions test/integration/runner-spec/run-collection-request.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -90,6 +90,66 @@ describe('pm.execution.runRequest handling', function () {
});
});

it('should provide req metadata from event.requests object to resolver along with root req id', function (done) {
const requestsMeta = {
// Refer to postman-collection package to know more about this field
'nested-request-id': {
location: ['Collection Name', 'Folder Name', 'Request Name']
}
},
collection = new sdk.Collection({
item: [{
id: 'root-request-id',
event: [{
listen: 'prerequest',
script: {
exec: `
await pm.execution.runRequest("nested-request-id");
await pm.execution.runRequest("nested-request-id-without-fallback");
`,
requests: requestsMeta
}
}],
request: {
url: 'https://postman-echo.com/get',
method: 'GET'
}
}]
});

new collectionRunner().run(collection, {
script: {
requestResolver: (nestedRequestId, nestedRequestContext, callback) => {
expect(typeof callback).to.eql('function');
expect(nestedRequestContext).to.be.ok;
expect(nestedRequestContext.rootItemId).to.eql('root-request-id');

if (nestedRequestId === 'nested-request-id') {
expect(nestedRequestContext.nestedRequestMeta).to.eql(requestsMeta['nested-request-id']);
}

if (nestedRequestId === 'nested-request-id-without-fallback') {
// Should be empty for this request
expect(nestedRequestContext.nestedRequestMeta).to.not.be.ok;
}

return callback(null, {
item: {
id: 'nested-request-id',
request: { url: 'https://postman-echo.com/post', method: 'POST' }
}
});
}
}
}, function (_err, run) {
run.start({
done (err) {
done(err);
}
});
});
});

it('should handle for exceptions thrown from nested request parsing or uncaught errors', function (done) {
const collection = new sdk.Collection({
item: [{
Expand Down Expand Up @@ -117,7 +177,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -172,7 +232,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -237,7 +297,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -331,7 +391,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -412,7 +472,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -477,7 +537,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -527,7 +587,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -595,7 +655,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -683,7 +743,7 @@ describe('pm.execution.runRequest handling', function () {
{
vaultSecrets: vaultSecrets,
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -761,7 +821,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -833,7 +893,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down Expand Up @@ -906,7 +966,7 @@ describe('pm.execution.runRequest handling', function () {
new collectionRunner().run(collection,
{
script: {
requestResolver (_requestId, callback) {
requestResolver (_requestId, _nestedRequestContext, callback) {
callback(null, {
item: {
id: 'nested-request-id',
Expand Down
Loading