From 647c82641ed4c148161f4a1d2de9741b4092e169 Mon Sep 17 00:00:00 2001 From: kakha urigashvili Date: Wed, 2 Dec 2020 13:08:03 -0800 Subject: [PATCH] fix: add explicit check for folder permissions to create a project --- lib/view/prompt-view.js | 6 ++++++ test/unit/view/prompt-view-test.js | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/view/prompt-view.js b/lib/view/prompt-view.js index ba0bc4ba..b4c92c3b 100644 --- a/lib/view/prompt-view.js +++ b/lib/view/prompt-view.js @@ -1,3 +1,4 @@ +const fs = require('fs'); const inquirer = require('inquirer'); const stringUtils = require('@src/utils/string-utils'); @@ -21,6 +22,11 @@ function getProjectFolderName(defaultName, callback) { if (!input || stringUtils.filterNonAlphanumeric(input) === '') { return 'Project folder name should consist of alphanumeric character(s) plus "-" only.'; } + try { + fs.accessSync(process.cwd(), fs.constants.W_OK); + } catch (error) { + return `No write access inside of the folder: ${process.cwd()}.`; + } return true; } }]).then((answer) => { diff --git a/test/unit/view/prompt-view-test.js b/test/unit/view/prompt-view-test.js index ad4b7c6b..05ef6827 100644 --- a/test/unit/view/prompt-view-test.js +++ b/test/unit/view/prompt-view-test.js @@ -1,4 +1,5 @@ const { expect } = require('chai'); +const fs = require('fs'); const inquirer = require('inquirer'); const sinon = require('sinon'); @@ -19,6 +20,7 @@ function validateInquirerConfig(stub, expectedConfig) { describe('View test - prompt view test', () => { const TEST_ERROR = 'init error'; let infoStub; + let accessSyncStub; describe('# validate ui.getProjectFolderName', () => { beforeEach(() => { @@ -27,6 +29,7 @@ describe('View test - prompt view test', () => { sinon.stub(Messenger, 'getInstance').returns({ info: infoStub }); + accessSyncStub = sinon.stub(fs, 'accessSync'); }); afterEach(() => { @@ -96,5 +99,18 @@ describe('View test - prompt view test', () => { done(); }); }); + it('| user does not have read/write to project folder, expect return error message string', (done) => { + // setup + const TEST_DEFAULT_NAME = 'some-folder'; + inquirer.prompt.resolves({ projectFolderName: TEST_DEFAULT_NAME }); + accessSyncStub.throws('Some error'); + // call + ui.getProjectFolderName(TEST_DEFAULT_NAME, () => { + // verify + expect(inquirer.prompt.args[0][0][0].validate(TEST_DEFAULT_NAME)) + .include('No write access inside of the folder'); + done(); + }); + }); }); });