diff --git a/src/cli/tests/cli.unit.spec.ts b/src/cli/tests/cli.unit.spec.ts index 1f5aa0f..83c6786 100644 --- a/src/cli/tests/cli.unit.spec.ts +++ b/src/cli/tests/cli.unit.spec.ts @@ -13,6 +13,7 @@ import { install, Placeholders } from '../tasks'; +import { completeSpinner } from '../typescript-starter'; test('errors if outdated', async t => { nock.disableNetConnect(); @@ -119,6 +120,19 @@ test('getUserInfo: suppresses errors and returns empty strings', async t => { }); }); +test('getUserInfo: returns results properly', async t => { + const mock = ((async () => { + return { + stdout: 'result' + }; + }) as any) as ExecaStatic; + const result = await getUserInfo(mock)(); + t.deepEqual(result, { + gitEmail: 'result', + gitName: 'result' + }); +}); + test('initialCommit: throws generated errors', async t => { const error = await t.throws( initialCommit(mockErr(1))('deadbeef', 'fail', 'name', 'bitjson@github.com') @@ -126,10 +140,21 @@ test('initialCommit: throws generated errors', async t => { t.is(error.code, 1); }); +test('initialCommit: attempts to commit', async t => { + // tslint:disable-next-line:no-let + t.plan(4); + const mock = ((async () => { + t.pass(); + }) as any) as ExecaStatic; + t.true( + await initialCommit(mock)('commit', 'dir', 'name', 'valid@example.com') + ); +}); + test("initialCommit: don't attempt to commit if user.name/email is not set", async t => { // tslint:disable-next-line:no-let let calls = 0; - const errorIf3 = ((() => { + const errorIf3 = ((async () => { calls++; calls === 1 ? t.pass() : calls === 2 ? t.pass() : t.fail(); }) as any) as ExecaStatic; @@ -144,7 +169,7 @@ test("initialCommit: don't attempt to commit if user.name/email is not set", asy }); test('install: uses the correct runner', async t => { - const mock = (((runner: Runner) => { + const mock = ((async (runner: Runner) => { runner === Runner.Yarn ? t.pass() : t.fail(); }) as any) as ExecaStatic; await install(mock)(true, Runner.Yarn, 'pass'); @@ -154,3 +179,15 @@ test('install: throws pretty error on failure', async t => { const error = await t.throws(install(mockErr())(true, Runner.Npm, 'fail')); t.is(error.message, "Installation failed. You'll need to install manually."); }); + +test('completeSpinner: resolves spinners properly', async t => { + t.plan(2); + const never = () => { + t.fail(); + }; + const check = (confirm?: string) => (result?: string) => { + confirm ? t.is(confirm, result) : t.pass(); + }; + completeSpinner({ succeed: check(), fail: never }, true); + completeSpinner({ succeed: never, fail: check('message') }, false, 'message'); +}); diff --git a/src/cli/typescript-starter.ts b/src/cli/typescript-starter.ts index 1994050..7bf3071 100644 --- a/src/cli/typescript-starter.ts +++ b/src/cli/typescript-starter.ts @@ -144,11 +144,22 @@ export async function typescriptStarter( await tasks.install(install, runner, projectPath); const spinner7 = ora(`Initializing git repository`).start(); - (await tasks.initialCommit(commitHash, projectPath, gitName, gitEmail)) - ? spinner7.succeed() - : spinner7.fail( - "Git config user.name and user.email are not configured. You'll need to `git commit` yourself." - ); + completeSpinner( + spinner7, + await tasks.initialCommit(commitHash, projectPath, gitName, gitEmail), + "Git config user.name and user.email are not configured. You'll need to `git commit` yourself." + ); console.log(`\n${chalk.blue.bold(`Created ${name} 🎉`)}\n`); } + +export function completeSpinner( + spinner: { + readonly succeed: (text?: string) => any; + readonly fail: (text?: string) => any; + }, + success: boolean, + message?: string +): void { + success ? spinner.succeed() : spinner.fail(message); +}