From 7b7bd60d161410566e5f7935eaacb6b0287e099d Mon Sep 17 00:00:00 2001 From: Thomas Betous Date: Thu, 3 Oct 2019 10:03:15 +0200 Subject: [PATCH 1/4] :sparkles: Add check for overwrite readme Add check for overwrite readme #140 --- src/ask-overwrite.js | 26 ++++++++++++++++++++++++++ src/cli.js | 2 ++ src/readme.js | 10 +++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/ask-overwrite.js diff --git a/src/ask-overwrite.js b/src/ask-overwrite.js new file mode 100644 index 0000000..ae2a49d --- /dev/null +++ b/src/ask-overwrite.js @@ -0,0 +1,26 @@ +const inquirer = require('inquirer') + +const question = { + type: 'list', + message: + '⚠ Readme-md-generator will overwrite your current README.md. Are you sure you want to continue? ', + name: 'overwriteReadme', + choices: [ + { + name: 'No', + value: false + }, + { + name: 'Yes ', + value: true + } + ] +} + +/** + * Ask user if he wants overwrite the existed README + */ +module.exports = async () => { + const { overwriteReadme } = await inquirer.prompt([question]) + return overwriteReadme +} diff --git a/src/cli.js b/src/cli.js index 2cec288..6f6b470 100644 --- a/src/cli.js +++ b/src/cli.js @@ -5,6 +5,7 @@ const askQuestions = require('./ask-questions') /** * Main process: + * 1) Check overwrite README.md * 1) Get README template path * 2) Gather project infos * 3) Ask user questions @@ -14,6 +15,7 @@ const askQuestions = require('./ask-questions') * @param {Object} args */ module.exports = async ({ customTemplatePath, useDefaultAnswers }) => { + if (!(await readme.checkOverwriteReadme())) return const templatePath = await readme.getReadmeTemplatePath( customTemplatePath, useDefaultAnswers diff --git a/src/readme.js b/src/readme.js index 6f3cf43..d5288e6 100644 --- a/src/readme.js +++ b/src/readme.js @@ -6,6 +6,7 @@ const fs = require('fs') const { isNil, unescape } = require('lodash') const chooseTemplate = require('./choose-template') +const askOverwriteReadme = require('./ask-overwrite') const README_PATH = 'README.md' @@ -95,9 +96,16 @@ const getReadmeTemplatePath = async (customTemplate, useDefaultAnswers) => { return templatePath } +/** + * Check if readme generator can overwrite the existed readme + */ +const checkOverwriteReadme = () => + !fs.existsSync(README_PATH) || askOverwriteReadme() + module.exports = { writeReadme, buildReadmeContent, README_PATH, - getReadmeTemplatePath + getReadmeTemplatePath, + checkOverwriteReadme } From 6bc4aa7e9afb1e0186eba14ebbb78fee5ad7ba03 Mon Sep 17 00:00:00 2001 From: Thomas Betous Date: Thu, 3 Oct 2019 10:08:21 +0200 Subject: [PATCH 2/4] Update cli.js --- src/cli.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cli.js b/src/cli.js index 6f6b470..8af625c 100644 --- a/src/cli.js +++ b/src/cli.js @@ -6,11 +6,11 @@ const askQuestions = require('./ask-questions') /** * Main process: * 1) Check overwrite README.md - * 1) Get README template path - * 2) Gather project infos - * 3) Ask user questions - * 4) Build README content - * 5) Create README.md file + * 2) Get README template path + * 3) Gather project infos + * 4) Ask user questions + * 5) Build README content + * 6) Create README.md file * * @param {Object} args */ From addd00d65a42aaf443df0bee2a83f4e01334f482 Mon Sep 17 00:00:00 2001 From: Thomas Betous Date: Thu, 3 Oct 2019 14:43:13 +0200 Subject: [PATCH 3/4] Add tests --- src/ask-overwrite.spec.js | 44 +++++++++++++++++++++++++++++++++++++++ src/cli.spec.js | 20 ++++++++++++++++++ src/readme.spec.js | 22 +++++++++++++++++++- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/ask-overwrite.spec.js diff --git a/src/ask-overwrite.spec.js b/src/ask-overwrite.spec.js new file mode 100644 index 0000000..2d174ad --- /dev/null +++ b/src/ask-overwrite.spec.js @@ -0,0 +1,44 @@ +const inquirer = require('inquirer') + +const askOverwrite = require('./ask-overwrite') + +const expectedQuestion = { + type: 'list', + message: + '⚠ Readme-md-generator will overwrite your current README.md. Are you sure you want to continue? ', + name: 'overwriteReadme', + choices: [ + { + name: 'No', + value: false + }, + { + name: 'Yes ', + value: true + } + ] +} + +inquirer.prompt = jest.fn(items => + Promise.resolve( + items.reduce((result, item) => { + result[item.name] = 'value' + return result + }, {}) + ) +) + +describe('ask-overwrite', () => { + beforeEach(() => { + inquirer.prompt.mockClear() + }) + + it('should call prompt right questions', async () => { + await askOverwrite() + expect(inquirer.prompt).toHaveBeenCalledWith([expectedQuestion]) + }) + + it('should return the right value', async () => { + expect(await askOverwrite()).toEqual('value') + }) +}) diff --git a/src/cli.spec.js b/src/cli.spec.js index d6a5a4a..4f0c39f 100644 --- a/src/cli.spec.js +++ b/src/cli.spec.js @@ -43,6 +43,25 @@ describe('mainProcess', () => { askQuestions.mockClear() }) + it('should stop immediatly if user dont want overwrite', async () => { + const customTemplatePath = undefined + const useDefaultAnswers = true + infos.getProjectInfos = jest.fn() + readme.buildReadmeContent = jest.fn() + readme.getReadmeTemplatePath = jest.fn() + readme.writeReadme = jest.fn() + readme.checkOverwriteReadme = jest.fn(() => Promise.resolve(false)) + utils.showEndMessage = jest.fn() + + await mainProcess({ customTemplatePath, useDefaultAnswers }) + + expect(infos.getProjectInfos).not.toHaveBeenCalled() + expect(readme.buildReadmeContent).not.toHaveBeenCalled() + expect(readme.getReadmeTemplatePath).not.toHaveBeenCalled() + expect(readme.writeReadme).not.toHaveBeenCalled() + expect(utils.showEndMessage).not.toHaveBeenCalled() + }) + it('should call main functions with correct args', async () => { const customTemplatePath = undefined const useDefaultAnswers = true @@ -52,6 +71,7 @@ describe('mainProcess', () => { infos.getProjectInfos = jest.fn(() => Promise.resolve(projectInformations)) readme.buildReadmeContent = jest.fn(() => Promise.resolve(readmeContent)) readme.getReadmeTemplatePath = jest.fn(() => Promise.resolve(templatePath)) + readme.checkOverwriteReadme = jest.fn(() => Promise.resolve(true)) readme.writeReadme = jest.fn() utils.showEndMessage = jest.fn() diff --git a/src/readme.spec.js b/src/readme.spec.js index bf95766..57ce7f8 100644 --- a/src/readme.spec.js +++ b/src/readme.spec.js @@ -2,6 +2,7 @@ const fs = require('fs') const ora = require('ora') const path = require('path') const chooseTemplate = require('./choose-template') +const askOverwriteReadme = require('./ask-overwrite') const defaultTemplatePath = path.resolve(__dirname, '../templates/default.md') const defaultNoHtmlTemplatePath = path.resolve( @@ -14,7 +15,8 @@ const { writeReadme, buildReadmeContent, README_PATH, - getReadmeTemplatePath + getReadmeTemplatePath, + checkOverwriteReadme } = require('./readme') describe('readme', () => { @@ -206,7 +208,25 @@ describe('readme', () => { ) }) }) + + describe('checkOverwrite', () => { + it('should return true if README does not exist', async () => { + fs.existsSync = jest.fn(p => p !== README_PATH) + expect(await checkOverwriteReadme()).toEqual(true) + }) + it('should return true if README exist and user want to overwrite it', async () => { + fs.existsSync = jest.fn(p => p === README_PATH) + askOverwriteReadme.mockResolvedValue(true) + expect(await checkOverwriteReadme()).toEqual(true) + }) + it('should return false if README exist and user dont want to overwrite it', async () => { + fs.existsSync = jest.fn(p => p === README_PATH) + askOverwriteReadme.mockResolvedValue(false) + expect(await checkOverwriteReadme()).toEqual(false) + }) + }) }) jest.mock('ora') jest.mock('./choose-template') +jest.mock('./ask-overwrite') From b0fa1f0e912807491a3755308aec86facf0a0010 Mon Sep 17 00:00:00 2001 From: Thomas Betous Date: Fri, 4 Oct 2019 12:18:25 +0200 Subject: [PATCH 4/4] Fix remarks --- src/ask-overwrite.js | 2 +- src/ask-overwrite.spec.js | 2 +- src/cli.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ask-overwrite.js b/src/ask-overwrite.js index ae2a49d..4363a95 100644 --- a/src/ask-overwrite.js +++ b/src/ask-overwrite.js @@ -3,7 +3,7 @@ const inquirer = require('inquirer') const question = { type: 'list', message: - '⚠ Readme-md-generator will overwrite your current README.md. Are you sure you want to continue? ', + '🚨 readme-md-generator will overwrite your current README.md. Are you sure you want to continue? ', name: 'overwriteReadme', choices: [ { diff --git a/src/ask-overwrite.spec.js b/src/ask-overwrite.spec.js index 2d174ad..001774e 100644 --- a/src/ask-overwrite.spec.js +++ b/src/ask-overwrite.spec.js @@ -5,7 +5,7 @@ const askOverwrite = require('./ask-overwrite') const expectedQuestion = { type: 'list', message: - '⚠ Readme-md-generator will overwrite your current README.md. Are you sure you want to continue? ', + '🚨 readme-md-generator will overwrite your current README.md. Are you sure you want to continue? ', name: 'overwriteReadme', choices: [ { diff --git a/src/cli.js b/src/cli.js index 8af625c..4b6e2c4 100644 --- a/src/cli.js +++ b/src/cli.js @@ -16,6 +16,7 @@ const askQuestions = require('./ask-questions') */ module.exports = async ({ customTemplatePath, useDefaultAnswers }) => { if (!(await readme.checkOverwriteReadme())) return + const templatePath = await readme.getReadmeTemplatePath( customTemplatePath, useDefaultAnswers