From 4ce46e5155c0a9f4dd3d684686bbadc9a5b067e0 Mon Sep 17 00:00:00 2001 From: nagpalkaran95 Date: Mon, 31 Aug 2020 19:43:56 +0530 Subject: [PATCH 1/5] Support non-default BrowserStack config generation --- bin/commands/init.js | 34 ++++++++++++---- bin/helpers/constants.js | 3 +- bin/runner.js | 2 +- test/unit/bin/commands/init.js | 73 +++++++++++++++++++++++++++++++++- 4 files changed, 102 insertions(+), 10 deletions(-) diff --git a/bin/commands/init.js b/bin/commands/init.js index 16e17011..ff879efc 100644 --- a/bin/commands/init.js +++ b/bin/commands/init.js @@ -6,16 +6,36 @@ const fileHelpers = require("../helpers/fileHelpers"), util = require("util"), path = require('path'); -module.exports = function init(args) { - if (args.p) { - var path_to_bsconf = path.join(args.p + "/browserstack.json"); - } else { - var path_to_bsconf = "./browserstack.json"; + +function get_path(args) { + if (args._.length > 1 && args.p) { + let filename = args._[1]; + if (filename !== path.basename(filename)) { + let message = Constants.userMessages.CONFLICTING_INIT_ARGUMENTS; + logger.error(message); + utils.sendUsageReport(null, args, message, Constants.messageTypes.ERROR, 'conflicting_path_json_init'); + return; + } + + return path.join(args.p, filename); + } else if (args.p) { + return path.join(args.p, "browserstack.json"); + } else if (args._.length > 1) { + return path.join(process.cwd(), args._[1]); } - var config = { + return path.join(process.cwd(), "browserstack.json"); +} + + +module.exports = function init(args) { + + let path_to_json = get_path(args); + if (path_to_json === undefined) return; + + let config = { file: require('../templates/configTemplate')(), - path: path_to_bsconf + path: path_to_json }; return fileHelpers.dirExists(config.path, function(dirExists){ diff --git a/bin/helpers/constants.js b/bin/helpers/constants.js index d1a50ec1..bb0ac6ca 100644 --- a/bin/helpers/constants.js +++ b/bin/helpers/constants.js @@ -12,7 +12,8 @@ const userMessages = { ZIP_DELETED: "Zip file deleted successfully.", API_DEPRECATED: "This version of API is deprecated, please use latest version of API.", FAILED_TO_ZIP: "Failed to zip files.", - VISIT_DASHBOARD: "Visit the Automate dashboard for test reporting:" + VISIT_DASHBOARD: "Visit the Automate dashboard for test reporting:", + CONFLICTING_INIT_ARGUMENTS: "Conflicting arguments given. You can use --path only with a file name, and not with a file path." }; const validationMessages = { diff --git a/bin/runner.js b/bin/runner.js index da7c71e4..41fc813b 100755 --- a/bin/runner.js +++ b/bin/runner.js @@ -22,7 +22,7 @@ var argv = yargs .demand(1, Constants.cliMessages.VERSION.DEMAND) .command('init', Constants.cliMessages.INIT.INFO, function(yargs) { argv = yargs - .usage("usage: $0 init [options]") + .usage("usage: $0 init [filename] [options]") .options({ 'p': { alias: "path", diff --git a/test/unit/bin/commands/init.js b/test/unit/bin/commands/init.js index 2275c39c..1f245eec 100644 --- a/test/unit/bin/commands/init.js +++ b/test/unit/bin/commands/init.js @@ -1,14 +1,20 @@ const chai = require("chai"), + assert = chai.assert, + expect = chai.expect, sinon = require("sinon"), chaiAsPromised = require("chai-as-promised"), + rewire = require("rewire"), util = require("util"); const Constants = require("../../../../bin/helpers/constants"), logger = require("../../../../bin/helpers/logger").winstonLogger, - testObjects = require("../../support/fixtures/testObjects"); + testObjects = require("../../support/fixtures/testObjects") + utils = require("../../../../bin/helpers/utils"); const proxyquire = require("proxyquire").noCallThru(); +const get_path = rewire("../../../../bin/commands/init").__get__("get_path");; + chai.use(chaiAsPromised); logger.transports["console.info"].silent = true; @@ -29,6 +35,71 @@ describe("init", () => { sinon.restore(); }); + describe("get_path", () => { + it("filename passed, -path passed", () => { + let args = { + _: ["init", "filename.json"], + p: '/sample-path', + path: '/sample-path', + $0: "browserstack-cypress", + }; + + assert(get_path(args), '/sample-path/filename.json'); + }); + + it("filename passed, -path not passed", () => { + let args = { + _: ["init", "filename.json"], + p: false, + path: false, + $0: "browserstack-cypress", + }; + + assert(get_path(args), 'filename.json'); + }); + + it("filepath passed, -path passed", () => { + let args = { + _: ["init", "/sample-path/filename.json"], + p: '/sample-path2', + path: '/sample-path2', + "disable-usage-reporting": undefined, + disableUsageReporting: undefined, + $0: "browserstack-cypress", + }; + + loggerStub = sandbox.stub(logger, 'error'); + usageStub = sandbox.stub(utils, 'sendUsageReport'); + + expect(get_path(args)).to.be.undefined; + sinon.assert.calledOnce(loggerStub); + sinon.assert.calledOnce(usageStub); + }); + + it("filename not passed, -path passed", () => { + let args = { + _: ["init"], + p: '/sample-path', + path: '/sample-path', + $0: "browserstack-cypress", + }; + + assert(get_path(args), '/sample-path/browserstack.json'); + }); + + it("filename not passed, -path not passed", () => { + let args = { + _: ["init"], + p: false, + path: false, + $0: "browserstack-cypress", + }; + + assert(get_path(args), 'browserstack.json'); + }); + }); + + describe("init", () => { it("fail if given path is not present", () => { dirExistsStub = sandbox.stub().yields(false); From acc6c06735b3644267a6322bbb198d4297c111dd Mon Sep 17 00:00:00 2001 From: nagpalkaran95 Date: Wed, 2 Sep 2020 15:22:40 +0530 Subject: [PATCH 2/5] handle absolute path in filename --- bin/commands/init.js | 5 +++++ test/unit/bin/commands/init.js | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/bin/commands/init.js b/bin/commands/init.js index ff879efc..947c80f1 100644 --- a/bin/commands/init.js +++ b/bin/commands/init.js @@ -21,6 +21,11 @@ function get_path(args) { } else if (args.p) { return path.join(args.p, "browserstack.json"); } else if (args._.length > 1) { + let filename = args._[1]; + if (filename !== path.basename(filename)) { + // filename is an absolute path + return filename; + } return path.join(process.cwd(), args._[1]); } diff --git a/test/unit/bin/commands/init.js b/test/unit/bin/commands/init.js index 1f245eec..b4331492 100644 --- a/test/unit/bin/commands/init.js +++ b/test/unit/bin/commands/init.js @@ -4,7 +4,8 @@ const chai = require("chai"), sinon = require("sinon"), chaiAsPromised = require("chai-as-promised"), rewire = require("rewire"), - util = require("util"); + util = require("util"), + path = require('path'); const Constants = require("../../../../bin/helpers/constants"), logger = require("../../../../bin/helpers/logger").winstonLogger, @@ -44,7 +45,7 @@ describe("init", () => { $0: "browserstack-cypress", }; - assert(get_path(args), '/sample-path/filename.json'); + expect(get_path(args)).to.be.eql('/sample-path/filename.json'); }); it("filename passed, -path not passed", () => { @@ -55,7 +56,15 @@ describe("init", () => { $0: "browserstack-cypress", }; - assert(get_path(args), 'filename.json'); + let args2 = { + _: ["init", "~/filename.json"], + p: false, + path: false, + $0: "browserstack-cypress", + }; + + expect(get_path(args)).to.be.eql(path.join(process.cwd(), 'filename.json')); + expect(get_path(args2)).to.be.eql('~/filename.json'); }); it("filepath passed, -path passed", () => { @@ -84,7 +93,7 @@ describe("init", () => { $0: "browserstack-cypress", }; - assert(get_path(args), '/sample-path/browserstack.json'); + expect(get_path(args)).to.be.eql('/sample-path/browserstack.json'); }); it("filename not passed, -path not passed", () => { @@ -95,7 +104,7 @@ describe("init", () => { $0: "browserstack-cypress", }; - assert(get_path(args), 'browserstack.json'); + expect(get_path(args)).to.be.eql(path.join(process.cwd(), 'browserstack.json')); }); }); From f952637e09a57f41b00a121ac400febba80887e5 Mon Sep 17 00:00:00 2001 From: nagpalkaran95 Date: Wed, 2 Sep 2020 17:47:37 +0530 Subject: [PATCH 3/5] append .json if filename passed is not of json type --- bin/commands/init.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/commands/init.js b/bin/commands/init.js index 947c80f1..954addc1 100644 --- a/bin/commands/init.js +++ b/bin/commands/init.js @@ -38,6 +38,9 @@ module.exports = function init(args) { let path_to_json = get_path(args); if (path_to_json === undefined) return; + // append .json if filename passed is not of json type + if (path.extname(path_to_json) !== ".json") path_to_json += '.json'; + let config = { file: require('../templates/configTemplate')(), path: path_to_json From 9c198c4fe344f211b05c231ff9af047987bb16b7 Mon Sep 17 00:00:00 2001 From: nagpalkaran95 Date: Wed, 16 Sep 2020 18:34:59 +0530 Subject: [PATCH 4/5] filename is path without name --- bin/commands/init.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bin/commands/init.js b/bin/commands/init.js index 954addc1..322ae026 100644 --- a/bin/commands/init.js +++ b/bin/commands/init.js @@ -24,7 +24,7 @@ function get_path(args) { let filename = args._[1]; if (filename !== path.basename(filename)) { // filename is an absolute path - return filename; + return filename; } return path.join(process.cwd(), args._[1]); } @@ -39,7 +39,13 @@ module.exports = function init(args) { if (path_to_json === undefined) return; // append .json if filename passed is not of json type - if (path.extname(path_to_json) !== ".json") path_to_json += '.json'; + if (path.extname(path_to_json) !== '' && path.extname(path_to_json) !== ".json") path_to_json += ".json"; + + // append browserstack.json if filename is a path without filename + if (path.extname(path_to_json) === '') path_to_json = path.join(path_to_json, "browserstack.json"); + + console.log(path_to_json); + return path_to_json; let config = { file: require('../templates/configTemplate')(), From 525270235ba1658c5550247f24c2f49fb9dd0b59 Mon Sep 17 00:00:00 2001 From: nagpalkaran95 Date: Wed, 16 Sep 2020 19:21:37 +0530 Subject: [PATCH 5/5] remove console log --- bin/commands/init.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/bin/commands/init.js b/bin/commands/init.js index 322ae026..6bd7246b 100644 --- a/bin/commands/init.js +++ b/bin/commands/init.js @@ -44,9 +44,6 @@ module.exports = function init(args) { // append browserstack.json if filename is a path without filename if (path.extname(path_to_json) === '') path_to_json = path.join(path_to_json, "browserstack.json"); - console.log(path_to_json); - return path_to_json; - let config = { file: require('../templates/configTemplate')(), path: path_to_json