From c9536e9e653bfd32263353d4271aa85cfeed6dc6 Mon Sep 17 00:00:00 2001 From: Vedanta Krishna Date: Mon, 16 Oct 2023 16:43:23 +0530 Subject: [PATCH] feat(property-base): add support to get path of current request in sandbox script --- CHANGELOG.yaml | 4 + .../nested-v2-collection-without-name.json | 182 ++++++++++++++++++ lib/collection/item.js | 20 ++ test/fixtures/index.js | 1 + test/unit/item.test.js | 34 ++++ 5 files changed, 241 insertions(+) create mode 100644 examples/nested-v2-collection-without-name.json diff --git a/CHANGELOG.yaml b/CHANGELOG.yaml index df8c18a38..82b3a3da7 100644 --- a/CHANGELOG.yaml +++ b/CHANGELOG.yaml @@ -1,3 +1,7 @@ +unreleased: + new features: + - GH-1338 Add ability to read path of the request in scripts + 4.2.1: date: 2023-09-11 fixed bugs: diff --git a/examples/nested-v2-collection-without-name.json b/examples/nested-v2-collection-without-name.json new file mode 100644 index 000000000..a99a88267 --- /dev/null +++ b/examples/nested-v2-collection-without-name.json @@ -0,0 +1,182 @@ +{ + "variables": [], + "info": { + "_postman_id": "e5f2e9cf-173b-c60a-7336-ac804a87d762", + "description": "A simple V2 collection to test out multi level folder flows", + "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" + }, + "item": [ + { + "description": "", + "item": [ + { + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "tests[\"Request executed in correct order\"] = postman.getEnvironmentVariable(\"count\") === 0;" + ] + } + } + ], + "request": { + "url": "https://postman-echo.com/get", + "method": "GET", + "header": [], + "body": {}, + "description": "" + }, + "response": [] + }, + { + "event": [ + + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "tests[\"Request executed in correct order\"] = postman.getEnvironmentVariable(\"count\") === \"1\";" + ] + } + } + ], + "request": { + "url": "https://postman-echo.com/get", + "method": "GET", + "header": [], + "body": {}, + "description": "" + }, + "response": [] + }, + { + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "tests[\"Request executed in correct order\"] = postman.getEnvironmentVariable(\"count\") === \"2\";" + ] + } + } + ], + "request": { + "url": "https://postman-echo.com/get", + "method": "GET", + "header": [], + "body": {}, + "description": "" + }, + "response": [] + } + ] + }, + { + "description": "", + "item": [ + { + "description": "", + "item": [ + { + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "var count = parseInt(postman.getEnvironmentVariable(\"count\"));", + "postman.setEnvironmentVariable(\"count\", isNaN(count) ? 0 : count + 1);" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "tests[\"Request executed in correct order\"] = postman.getEnvironmentVariable(\"count\") === \"3\";" + ] + } + } + ], + "request": { + "url": "https://postman-echo.com/get", + "method": "GET", + "header": [], + "body": {}, + "description": "" + }, + "response": [] + } + ] + }, + { + "description": "", + "item": [] + }, + { + "event": [ + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "tests[\"Request executed in correct order\"] = postman.getEnvironmentVariable(\"count\") === \"4\";" + ] + } + } + ], + "request": { + "url": "https://postman-echo.com/get", + "method": "GET", + "header": [], + "body": {}, + "description": "" + }, + "response": [] + } + ] + }, + { + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "var count = parseInt(postman.getEnvironmentVariable(\"count\"));", + "postman.setEnvironmentVariable(\"count\", isNaN(count) ? 0 : count + 1);" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "tests[\"Status code is 200\"] = responseCode.code === 200;", + "tests[\"Request executed in correct order\"] = postman.getEnvironmentVariable(\"count\") === \"5\";" + ] + } + } + ], + "request": { + "url": "https://postman-echo.com/get", + "method": "GET", + "header": [], + "body": {}, + "description": "" + }, + "response": [] + } + ] +} diff --git a/lib/collection/item.js b/lib/collection/item.js index 4bc131c2b..266c4ce8d 100644 --- a/lib/collection/item.js +++ b/lib/collection/item.js @@ -329,6 +329,26 @@ _.assign(Item.prototype, /** @lends Item.prototype */ { if (!this.request) { this.request = new Request(); } // worst case return this.request.authorizeUsing(type, options); + }, + + /** + * Returns the path of the item + * + * @returns {Array} + */ + getPath: function () { + const path = []; + + if (typeof this.name === 'string') { + const pushItem = (item) => { + path.push(item.name || ''); + }; + + pushItem(this); + this.forEachParent({ withRoot: true }, pushItem); + } + + return path.reverse(); } }); diff --git a/test/fixtures/index.js b/test/fixtures/index.js index 644ceb519..7e565c3e1 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -4,6 +4,7 @@ module.exports = { collectionV2: require('../../examples/collection-v2.json'), nestedCollectionV2: require('../../examples/nested-v2-collection.json'), + nestedCollectionV2WithoutNames: require('../../examples/nested-v2-collection-without-name.json'), rawUrls: [ // If adding to this list, add to the END, or you'll break a lot of tests which diff --git a/test/unit/item.test.js b/test/unit/item.test.js index bbb66c371..e9b845a8b 100644 --- a/test/unit/item.test.js +++ b/test/unit/item.test.js @@ -193,6 +193,40 @@ describe('Item', function () { }); }); + describe('.getPath()', function () { + it('should return correct path for 2 level nested item', function () { + const collection = new sdk.Collection(fixtures.nestedCollectionV2), + f1 = collection.items.members[0], + r1 = f1.items.members[0]; + + expect(r1.getPath()).to.deep.equal(['multi-level-folders-v2', 'F1', 'F1.R1']); + }); + + it('should return correct path for 1 level nested item', function () { + const collection = new sdk.Collection(fixtures.nestedCollectionV2), + r1 = collection.items.members[2]; + + expect(r1.getPath()).to.deep.equal(['multi-level-folders-v2', 'R1']); + }); + + it('should return correct path for 3 level nested item', function () { + const collection = new sdk.Collection(fixtures.nestedCollectionV2), + f2 = collection.items.members[1], + f3 = f2.items.members[0], + r1 = f3.items.members[0]; + + expect(r1.getPath()).to.deep.equal(['multi-level-folders-v2', 'F2', 'F2.F3', 'F2.F3.R1']); + }); + + it('should return path as empty array for item without name', function () { + const collection = new sdk.Collection(fixtures.nestedCollectionV2WithoutNames), + f1 = collection.items.members[0], + r1 = f1.items.members[0]; + + expect(r1.getPath()).to.deep.equal([]); + }); + }); + describe('.getAuth()', function () { var item, folder,