Skip to content

Commit 872648b

Browse files
authored
feat: Send nested request cached metadata from item to request resolver (#1530)
1 parent 4a116bb commit 872648b

File tree

5 files changed

+99
-18
lines changed

5 files changed

+99
-18
lines changed

CHANGELOG.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
unreleased:
2+
new features:
3+
- >-
4+
GH-1530 Pass any stored referenced request metadata and root item id
5+
to nested request resolver
26
fixed bugs:
37
- >-
48
GH-1529 Prevent crashes from nested request events after root request

lib/runner/extensions/event.command.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ module.exports = {
293293

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

296-
rootItemId = isNestedRequest ? this.state.nestedRequest.rootItemId : item.id,
296+
rootItemId = isNestedRequest && this.state.nestedRequest.rootItem ?
297+
this.state.nestedRequest.rootItem.id : item.id,
297298

298299
// create copy of cursor so we don't leak script ids outside `event.command`
299300
// and across scripts

lib/runner/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@ _.assign(Runner.prototype, {
7373
* @param {Number} [options.nestedRequest.rootCursor] - The cursor of the root request that spun up this
7474
* nested request runner. This is recursively passed down to keep track of which execution started the chain
7575
* and modify cursors for all nested req events for reporters built on top of postman-runtime.
76-
* @param {Number} [options.nestedRequest.rootItemId] - The id of the root item that spawned this nested request.
76+
* @param {Number} [options.nestedRequest.rootItem] - The root item that spawned this nested request.
7777
* Used by vault to get consent for root request and determine whether vault access check was performed even once
78-
* throughout the chain.
78+
* throughout the chain. And by request resolver bridge to receive any stored metadata like name/location of
79+
* the request being resolved
7980
* @param {Number} [options.nestedRequest.hasVaultAccess] - Mutated and set by any nested or parent request
8081
* to indicate whether vault access check has been performed.
8182
* @param {Number} [options.nestedRequest.invocationCount] - The number of requests currently accummulated

lib/runner/nested-request.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function runNestedRequest ({ executionId, isExecutionSkipped, vaultSecrets, item
2727
self.state.nestedRequest = _.defaults(self.state.nestedRequest || {}, {
2828
isNestedRequest: true,
2929
rootCursor: cursor,
30-
rootItemId: item.id,
30+
rootItem: item,
3131
invocationCount: 0
3232
});
3333

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

42+
let rootRequestEventsList = self.state.nestedRequest.rootItem.events?.all?.() || [],
43+
nestedRequestMeta = null,
44+
context = { rootItemId: self.state.nestedRequest.rootItem.id };
45+
46+
for (const event of rootRequestEventsList) {
47+
if (event.script?.requests?.[requestToRunId]) {
48+
nestedRequestMeta = event.script.requests[requestToRunId];
49+
break;
50+
}
51+
}
52+
53+
if (nestedRequestMeta) {
54+
context.nestedRequestMeta = nestedRequestMeta;
55+
}
56+
4257
// Should fetch the request from the consumer of postman-runtime & resolve scripts and variables
43-
requestResolver(requestToRunId, function (err, collection) {
58+
requestResolver(requestToRunId, context, function (err, collection) {
4459
if (err) {
4560
return dispatchErrorToListener(err);
4661
}

test/integration/runner-spec/run-collection-request.test.js

Lines changed: 73 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe('pm.execution.runRequest handling', function () {
3131
new collectionRunner().run(collection,
3232
{
3333
script: {
34-
requestResolver (_requestId, callback) {
34+
requestResolver (_requestId, _nestedRequestContext, callback) {
3535
callback(null, {
3636
item: {
3737
id: 'nested-request-id',
@@ -90,6 +90,66 @@ describe('pm.execution.runRequest handling', function () {
9090
});
9191
});
9292

93+
it('should provide req metadata from event.requests object to resolver along with root req id', function (done) {
94+
const requestsMeta = {
95+
// Refer to postman-collection package to know more about this field
96+
'nested-request-id': {
97+
location: ['Collection Name', 'Folder Name', 'Request Name']
98+
}
99+
},
100+
collection = new sdk.Collection({
101+
item: [{
102+
id: 'root-request-id',
103+
event: [{
104+
listen: 'prerequest',
105+
script: {
106+
exec: `
107+
await pm.execution.runRequest("nested-request-id");
108+
await pm.execution.runRequest("nested-request-id-without-fallback");
109+
`,
110+
requests: requestsMeta
111+
}
112+
}],
113+
request: {
114+
url: 'https://postman-echo.com/get',
115+
method: 'GET'
116+
}
117+
}]
118+
});
119+
120+
new collectionRunner().run(collection, {
121+
script: {
122+
requestResolver: (nestedRequestId, nestedRequestContext, callback) => {
123+
expect(typeof callback).to.eql('function');
124+
expect(nestedRequestContext).to.be.ok;
125+
expect(nestedRequestContext.rootItemId).to.eql('root-request-id');
126+
127+
if (nestedRequestId === 'nested-request-id') {
128+
expect(nestedRequestContext.nestedRequestMeta).to.eql(requestsMeta['nested-request-id']);
129+
}
130+
131+
if (nestedRequestId === 'nested-request-id-without-fallback') {
132+
// Should be empty for this request
133+
expect(nestedRequestContext.nestedRequestMeta).to.not.be.ok;
134+
}
135+
136+
return callback(null, {
137+
item: {
138+
id: 'nested-request-id',
139+
request: { url: 'https://postman-echo.com/post', method: 'POST' }
140+
}
141+
});
142+
}
143+
}
144+
}, function (_err, run) {
145+
run.start({
146+
done (err) {
147+
done(err);
148+
}
149+
});
150+
});
151+
});
152+
93153
it('should handle for exceptions thrown from nested request parsing or uncaught errors', function (done) {
94154
const collection = new sdk.Collection({
95155
item: [{
@@ -117,7 +177,7 @@ describe('pm.execution.runRequest handling', function () {
117177
new collectionRunner().run(collection,
118178
{
119179
script: {
120-
requestResolver (_requestId, callback) {
180+
requestResolver (_requestId, _nestedRequestContext, callback) {
121181
callback(null, {
122182
item: {
123183
id: 'nested-request-id',
@@ -172,7 +232,7 @@ describe('pm.execution.runRequest handling', function () {
172232
new collectionRunner().run(collection,
173233
{
174234
script: {
175-
requestResolver (_requestId, callback) {
235+
requestResolver (_requestId, _nestedRequestContext, callback) {
176236
callback(null, {
177237
item: {
178238
id: 'nested-request-id',
@@ -237,7 +297,7 @@ describe('pm.execution.runRequest handling', function () {
237297
new collectionRunner().run(collection,
238298
{
239299
script: {
240-
requestResolver (_requestId, callback) {
300+
requestResolver (_requestId, _nestedRequestContext, callback) {
241301
callback(null, {
242302
item: {
243303
id: 'nested-request-id',
@@ -331,7 +391,7 @@ describe('pm.execution.runRequest handling', function () {
331391
new collectionRunner().run(collection,
332392
{
333393
script: {
334-
requestResolver (_requestId, callback) {
394+
requestResolver (_requestId, _nestedRequestContext, callback) {
335395
callback(null, {
336396
item: {
337397
id: 'nested-request-id',
@@ -412,7 +472,7 @@ describe('pm.execution.runRequest handling', function () {
412472
new collectionRunner().run(collection,
413473
{
414474
script: {
415-
requestResolver (_requestId, callback) {
475+
requestResolver (_requestId, _nestedRequestContext, callback) {
416476
callback(null, {
417477
item: {
418478
id: 'nested-request-id',
@@ -477,7 +537,7 @@ describe('pm.execution.runRequest handling', function () {
477537
new collectionRunner().run(collection,
478538
{
479539
script: {
480-
requestResolver (_requestId, callback) {
540+
requestResolver (_requestId, _nestedRequestContext, callback) {
481541
callback(null, {
482542
item: {
483543
id: 'nested-request-id',
@@ -527,7 +587,7 @@ describe('pm.execution.runRequest handling', function () {
527587
new collectionRunner().run(collection,
528588
{
529589
script: {
530-
requestResolver (_requestId, callback) {
590+
requestResolver (_requestId, _nestedRequestContext, callback) {
531591
callback(null, {
532592
item: {
533593
id: 'nested-request-id',
@@ -595,7 +655,7 @@ describe('pm.execution.runRequest handling', function () {
595655
new collectionRunner().run(collection,
596656
{
597657
script: {
598-
requestResolver (_requestId, callback) {
658+
requestResolver (_requestId, _nestedRequestContext, callback) {
599659
callback(null, {
600660
item: {
601661
id: 'nested-request-id',
@@ -683,7 +743,7 @@ describe('pm.execution.runRequest handling', function () {
683743
{
684744
vaultSecrets: vaultSecrets,
685745
script: {
686-
requestResolver (_requestId, callback) {
746+
requestResolver (_requestId, _nestedRequestContext, callback) {
687747
callback(null, {
688748
item: {
689749
id: 'nested-request-id',
@@ -761,7 +821,7 @@ describe('pm.execution.runRequest handling', function () {
761821
new collectionRunner().run(collection,
762822
{
763823
script: {
764-
requestResolver (_requestId, callback) {
824+
requestResolver (_requestId, _nestedRequestContext, callback) {
765825
callback(null, {
766826
item: {
767827
id: 'nested-request-id',
@@ -833,7 +893,7 @@ describe('pm.execution.runRequest handling', function () {
833893
new collectionRunner().run(collection,
834894
{
835895
script: {
836-
requestResolver (_requestId, callback) {
896+
requestResolver (_requestId, _nestedRequestContext, callback) {
837897
callback(null, {
838898
item: {
839899
id: 'nested-request-id',
@@ -906,7 +966,7 @@ describe('pm.execution.runRequest handling', function () {
906966
new collectionRunner().run(collection,
907967
{
908968
script: {
909-
requestResolver (_requestId, callback) {
969+
requestResolver (_requestId, _nestedRequestContext, callback) {
910970
callback(null, {
911971
item: {
912972
id: 'nested-request-id',

0 commit comments

Comments
 (0)