From 552dffc3427e516d65feeded313f37f01948ebeb Mon Sep 17 00:00:00 2001 From: Derrick Reimer Date: Wed, 19 Aug 2020 08:33:54 -0500 Subject: [PATCH] Various output improvements --- src/cmds/deploy.js | 44 +++++++++++++++------ test/cmds/__snapshots__/deploy.test.js.snap | 32 +++++++++++++-- test/cmds/deploy.test.js | 34 ++++++++++++---- 3 files changed, 89 insertions(+), 21 deletions(-) diff --git a/src/cmds/deploy.js b/src/cmds/deploy.js index 57b5385..3bfb375 100644 --- a/src/cmds/deploy.js +++ b/src/cmds/deploy.js @@ -7,14 +7,36 @@ const messages = require('../messages'); const env = require('process').env; const { traverse } = require('../traverse'); -const printErrors = errors => { - console.error(''); - errors.forEach((error, idx) => { - console.error( - ` ${`${idx + 1})`} ${chalk.cyan(error.field)} ${error.message}` - ); +const printErrors = ({ code, errors }) => { + switch (code) { + case 'CONFIG_VALIDATION_ERROR': + console.error(''); + errors.forEach((error, idx) => { + console.error( + ` ${`${idx + 1})`} ${chalk.cyan(error.field)} ${error.message}` + ); + }); + console.error(''); + break; + + default: + console.error(''); + errors.forEach((error, idx) => { + console.error(` ${`${idx + 1})`} ${error.message}`); + }); + console.error(''); + break; + } +}; + +const printDeployLog = ({ log }) => { + if (!log) return; + + console.log(''); + log.forEach((item, idx) => { + console.log(` ${`${idx + 1})`} ${item}`); }); - console.error(''); + console.log(''); }; exports.command = 'deploy'; @@ -158,7 +180,7 @@ exports.handler = async args => { log.success( `Deployment succeeded ${chalk.gray(`(${response.data.id})`)}` ); - + printDeployLog(response.data); return; case 401: @@ -167,8 +189,8 @@ exports.handler = async args => { return; case 422: - log.error(`Deployment failed ${chalk.gray(`(${response.data.id})`)}`); - printErrors(response.data.errors); + log.error(`Deployment failed`); + printErrors(response.data); process.exitCode = 1; return; @@ -181,6 +203,6 @@ exports.handler = async args => { spinner.stop(); log.error('Deployment failed unexpectedly'); process.exitCode = 1; - throw error; + return; } }; diff --git a/test/cmds/__snapshots__/deploy.test.js.snap b/test/cmds/__snapshots__/deploy.test.js.snap index d0994a9..1d48310 100644 --- a/test/cmds/__snapshots__/deploy.test.js.snap +++ b/test/cmds/__snapshots__/deploy.test.js.snap @@ -1,15 +1,32 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`displays general validation errors 1`] = ` +exports[`displays general errors 1`] = ` Array [ Array [ - "✕ Deployment failed (xxxx-xxxx-xxxx)", + "✕ Deployment failed", ], Array [ "", ], Array [ - " 1) name is required", + " 1) JSON parsing error", + ], + Array [ + "", + ], +] +`; + +exports[`displays validation errors 1`] = ` +Array [ + Array [ + "✕ Deployment failed", + ], + Array [ + "", + ], + Array [ + " 1) foo.bar.baz is required", ], Array [ "", @@ -22,6 +39,15 @@ Array [ Array [ "✔ Deployment succeeded (xxxx-xxxx-xxxx)", ], + Array [ + "", + ], + Array [ + " 1) Added contact form", + ], + Array [ + "", + ], ] `; diff --git a/test/cmds/deploy.test.js b/test/cmds/deploy.test.js index 2d7247b..8903ad3 100644 --- a/test/cmds/deploy.test.js +++ b/test/cmds/deploy.test.js @@ -32,25 +32,45 @@ it('sends a deploy request with the right params', async () => { expect(params.key).toBe('xxx'); expect(params.userAgent).toBe(`@formspree/cli@${version}`); - return Promise.resolve({ status: 200, data: { id: 'xxxx-xxxx-xxxx' } }); + return Promise.resolve({ + status: 200, + data: { id: 'xxxx-xxxx-xxxx', log: ['Added contact form'] } + }); }); await cmd.handler({ config: '{}', key: 'xxx' }); expect(console.log.mock.calls).toMatchSnapshot(); }); -it('displays general validation errors', async () => { +it('displays general errors', async () => { + deploy.request.mockImplementation(_params => { + return Promise.resolve({ + status: 422, + data: { + code: 'CONFIG_SYNTAX_ERROR', + errors: [ + { + message: 'JSON parsing error' + } + ] + } + }); + }); + + await cmd.handler({ config: '{}', key: 'xxx' }); + expect(console.error.mock.calls).toMatchSnapshot(); +}); + +it('displays validation errors', async () => { deploy.request.mockImplementation(_params => { return Promise.resolve({ status: 422, data: { - id: 'xxxx-xxxx-xxxx', + code: 'CONFIG_VALIDATION_ERROR', errors: [ { - code: 'REQUIRED', - field: 'name', - message: 'is required', - properties: {} + field: 'foo.bar.baz', + message: 'is required' } ] }