diff --git a/src/ask-overwrite.js b/src/ask-overwrite.js new file mode 100644 index 0000000..4363a95 --- /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/ask-overwrite.spec.js b/src/ask-overwrite.spec.js new file mode 100644 index 0000000..001774e --- /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.js b/src/cli.js index 2cec288..4b6e2c4 100644 --- a/src/cli.js +++ b/src/cli.js @@ -5,15 +5,18 @@ const askQuestions = require('./ask-questions') /** * Main process: - * 1) Get README template path - * 2) Gather project infos - * 3) Ask user questions - * 4) Build README content - * 5) Create README.md file + * 1) Check overwrite README.md + * 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 */ module.exports = async ({ customTemplatePath, useDefaultAnswers }) => { + if (!(await readme.checkOverwriteReadme())) return + const templatePath = await readme.getReadmeTemplatePath( customTemplatePath, useDefaultAnswers 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.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 } 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')