diff --git a/CHANGELOG.yaml b/CHANGELOG.yaml index df8c18a38..bb8a4c186 100644 --- a/CHANGELOG.yaml +++ b/CHANGELOG.yaml @@ -1,3 +1,7 @@ +unreleased: + new features: + - GH-1339 Added getPath method to Item class + 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..db9663746 100644 --- a/lib/collection/item.js +++ b/lib/collection/item.js @@ -329,6 +329,23 @@ _.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 = [], + 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..e8fe6a9f2 100644 --- a/test/unit/item.test.js +++ b/test/unit/item.test.js @@ -193,6 +193,37 @@ describe('Item', function () { }); }); + describe('.getPath()', function () { + it('should return correct path for 2 level nested item', function () { + const collection = new sdk.Collection(fixtures.nestedCollectionV2), + req = collection.oneDeep('F1.R1'); + + expect(req.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), + req = collection.oneDeep('R1'); + + expect(req.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), + req = collection.oneDeep('F2.F3.R1'); + + expect(req.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,