From 206767be859d1bc115630f3deb28f8e736272341 Mon Sep 17 00:00:00 2001 From: thib92 Date: Wed, 18 Sep 2019 14:04:43 +0200 Subject: [PATCH 1/8] Add tests for androidHomeEnvVariable Move envinfo to a tool --- packages/cli/src/commands/doctor/doctor.ts | 26 +++------ .../__tests__/androidHomeEnvVariable.test.ts | 56 +++++++++++++++++++ packages/cli/src/commands/info/info.ts | 12 +--- packages/cli/src/tools/envinfo.ts | 18 ++++++ 4 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts create mode 100644 packages/cli/src/tools/envinfo.ts diff --git a/packages/cli/src/commands/doctor/doctor.ts b/packages/cli/src/commands/doctor/doctor.ts index ec28c6bbf..a86a9e52b 100644 --- a/packages/cli/src/commands/doctor/doctor.ts +++ b/packages/cli/src/commands/doctor/doctor.ts @@ -1,6 +1,4 @@ import chalk from 'chalk'; -// @ts-ignore -import envinfo from 'envinfo'; import {logger} from '@react-native-community/cli-tools'; import {getHealthchecks, HEALTHCHECK_TYPES} from './healthchecks'; import {getLoader} from '../../tools/loader'; @@ -12,6 +10,7 @@ import { HealthCheckCategoryResult, HealthCheckResult, } from './types'; +import getEnvironmentInfo from '../../tools/envinfo'; const printCategory = ({label, key}: {label: string; key: number}) => { if (key > 0) { @@ -58,18 +57,7 @@ export default (async (_, __, options) => { loader.start('Running diagnostics...'); - const environmentInfo = JSON.parse( - await envinfo.run( - { - Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], - IDEs: ['Xcode', 'Android Studio'], - SDKs: ['iOS SDK', 'Android SDK'], - npmPackages: ['react', 'react-native', '@react-native-community/cli'], - npmGlobalPackages: ['*react-native*'], - }, - {json: true, showNotFound: true}, - ), - ); + const environmentInfo = JSON.parse(await getEnvironmentInfo()); const iterateOverHealthChecks = async ({ label, @@ -106,8 +94,9 @@ export default (async (_, __, options) => { )).filter(healthcheck => healthcheck !== undefined) as HealthCheckResult[], }); - // Remove all the categories that don't have any healthcheck with `needsToBeFixed` - // so they don't show when the user taps to fix encountered issues + // Remove all the categories that don't have any healthcheck with + // `needsToBeFixed` so they don't show when the user taps to fix encountered + // issues const removeFixedCategories = (categories: HealthCheckCategoryResult[]) => categories.filter(category => category.healthchecks.some(healthcheck => healthcheck.needsToBeFixed), @@ -128,7 +117,10 @@ export default (async (_, __, options) => { }; healthchecksPerCategory.forEach((issueCategory, key) => { - printCategory({...issueCategory, key}); + printCategory({ + ...issueCategory, + key, + }); issueCategory.healthchecks.forEach(healthcheck => { printIssue(healthcheck); diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts new file mode 100644 index 000000000..6d620cb5c --- /dev/null +++ b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts @@ -0,0 +1,56 @@ +import androidHomeEnvVariables from '../androidHomeEnvVariable'; +import getEnvironmentInfo from '../../../../tools/envinfo'; +import {EnvironmentInfo} from '../../types'; +import {Ora} from 'ora'; + +jest.mock('../common'); + +import {logManualInstallation} from '../common'; + +describe('androidHomeEnvVariables', () => { + const OLD_ENV = process.env; + + it('returns a message if no ANDROID_HOME is defined', async () => { + delete process.env.ANDROID_HOME; + + const environmentInfo: EnvironmentInfo = JSON.parse( + await getEnvironmentInfo(), + ); + const diagnostics = await androidHomeEnvVariables.getDiagnostics( + environmentInfo, + ); + expect(typeof diagnostics.needsToBeFixed).toBe('string'); + }); + + it('returns false if ANDROID_HOME is defined', async () => { + process.env.ANDROID_HOME = '/fake/path/to/android/home'; + + const environmentInfo: EnvironmentInfo = JSON.parse( + await getEnvironmentInfo(), + ); + const diagnostics = await androidHomeEnvVariables.getDiagnostics( + environmentInfo, + ); + expect(diagnostics.needsToBeFixed).toBe(false); + }); + + it('logs manual installation steps to the screen', async () => { + // @ts-ignore + const loader: Ora = { + info: jest.fn(), + }; + + const environmentInfo: EnvironmentInfo = JSON.parse( + await getEnvironmentInfo(), + ); + + androidHomeEnvVariables.runAutomaticFix({loader, environmentInfo}); + + expect(logManualInstallation).toHaveBeenCalledTimes(1); + }); + + afterEach(() => { + process.env = OLD_ENV; + jest.resetAllMocks(); + }); +}); diff --git a/packages/cli/src/commands/info/info.ts b/packages/cli/src/commands/info/info.ts index eb5fca11c..d9ad3988f 100644 --- a/packages/cli/src/commands/info/info.ts +++ b/packages/cli/src/commands/info/info.ts @@ -5,23 +5,15 @@ * LICENSE file in the root directory of this source tree. */ -// @ts-ignore untyped -import envinfo from 'envinfo'; import {logger} from '@react-native-community/cli-tools'; import {Config} from '@react-native-community/cli-types'; import releaseChecker from '../../tools/releaseChecker'; +import getEnvironmentInfo from '../../tools/envinfo'; const info = async function getInfo(_argv: Array, ctx: Config) { try { logger.info('Fetching system and libraries information...'); - const output = await envinfo.run({ - System: ['OS', 'CPU', 'Memory', 'Shell'], - Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], - IDEs: ['Xcode', 'Android Studio'], - SDKs: ['iOS SDK', 'Android SDK'], - npmPackages: ['react', 'react-native', '@react-native-community/cli'], - npmGlobalPackages: '*react-native*', - }); + const output = await getEnvironmentInfo(); logger.log(output.trim()); } catch (err) { logger.error(`Unable to print environment info.\n${err}`); diff --git a/packages/cli/src/tools/envinfo.ts b/packages/cli/src/tools/envinfo.ts new file mode 100644 index 000000000..4a2912aaf --- /dev/null +++ b/packages/cli/src/tools/envinfo.ts @@ -0,0 +1,18 @@ +// @ts-ignore +import envinfo from 'envinfo'; + +export default async function getEnvironmentInfo() { + return envinfo.run( + { + Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], + IDEs: ['Xcode', 'Android Studio'], + SDKs: ['iOS SDK', 'Android SDK'], + npmPackages: ['react', 'react-native', '@react-native-community/cli'], + npmGlobalPackages: ['*react-native*'], + }, + { + json: true, + showNotFound: true, + }, + ); +} From df1c103bda113277238d14ad30be560a525599e0 Mon Sep 17 00:00:00 2001 From: thib92 Date: Wed, 18 Sep 2019 14:27:33 +0200 Subject: [PATCH 2/8] Add System to envinfo --- packages/cli/src/tools/envinfo.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/tools/envinfo.ts b/packages/cli/src/tools/envinfo.ts index 4a2912aaf..cbb9c4b16 100644 --- a/packages/cli/src/tools/envinfo.ts +++ b/packages/cli/src/tools/envinfo.ts @@ -4,6 +4,7 @@ import envinfo from 'envinfo'; export default async function getEnvironmentInfo() { return envinfo.run( { + System: ['OS', 'CPU', 'Memory', 'Shell'], Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], IDEs: ['Xcode', 'Android Studio'], SDKs: ['iOS SDK', 'Android SDK'], From 4b1da9764778bc2d5542ec4daaa6245eed4a5cad Mon Sep 17 00:00:00 2001 From: thib92 Date: Wed, 18 Sep 2019 14:33:39 +0200 Subject: [PATCH 3/8] Restore envinfo in info command --- packages/cli/src/commands/info/info.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/info/info.ts b/packages/cli/src/commands/info/info.ts index d9ad3988f..eb5fca11c 100644 --- a/packages/cli/src/commands/info/info.ts +++ b/packages/cli/src/commands/info/info.ts @@ -5,15 +5,23 @@ * LICENSE file in the root directory of this source tree. */ +// @ts-ignore untyped +import envinfo from 'envinfo'; import {logger} from '@react-native-community/cli-tools'; import {Config} from '@react-native-community/cli-types'; import releaseChecker from '../../tools/releaseChecker'; -import getEnvironmentInfo from '../../tools/envinfo'; const info = async function getInfo(_argv: Array, ctx: Config) { try { logger.info('Fetching system and libraries information...'); - const output = await getEnvironmentInfo(); + const output = await envinfo.run({ + System: ['OS', 'CPU', 'Memory', 'Shell'], + Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], + IDEs: ['Xcode', 'Android Studio'], + SDKs: ['iOS SDK', 'Android SDK'], + npmPackages: ['react', 'react-native', '@react-native-community/cli'], + npmGlobalPackages: '*react-native*', + }); logger.log(output.trim()); } catch (err) { logger.error(`Unable to print environment info.\n${err}`); From e4e81bb0f63c6905d356ec7a765190655762f225 Mon Sep 17 00:00:00 2001 From: thib92 Date: Wed, 18 Sep 2019 14:34:43 +0200 Subject: [PATCH 4/8] Remove System since it's not used --- packages/cli/src/tools/envinfo.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/src/tools/envinfo.ts b/packages/cli/src/tools/envinfo.ts index cbb9c4b16..4a2912aaf 100644 --- a/packages/cli/src/tools/envinfo.ts +++ b/packages/cli/src/tools/envinfo.ts @@ -4,7 +4,6 @@ import envinfo from 'envinfo'; export default async function getEnvironmentInfo() { return envinfo.run( { - System: ['OS', 'CPU', 'Memory', 'Shell'], Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], IDEs: ['Xcode', 'Android Studio'], SDKs: ['iOS SDK', 'Android SDK'], From 88b6f8e392654211c75ca09c20bc25b9531f6808 Mon Sep 17 00:00:00 2001 From: thib92 Date: Wed, 18 Sep 2019 16:17:07 +0200 Subject: [PATCH 5/8] Use any instead of Ora to avoid TS error --- .../healthchecks/__tests__/androidHomeEnvVariable.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts index 6d620cb5c..ce2d58ace 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts +++ b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts @@ -1,7 +1,6 @@ import androidHomeEnvVariables from '../androidHomeEnvVariable'; import getEnvironmentInfo from '../../../../tools/envinfo'; import {EnvironmentInfo} from '../../types'; -import {Ora} from 'ora'; jest.mock('../common'); @@ -35,8 +34,7 @@ describe('androidHomeEnvVariables', () => { }); it('logs manual installation steps to the screen', async () => { - // @ts-ignore - const loader: Ora = { + const loader: any = { info: jest.fn(), }; From 3c5ea62dbb7204de4d829fd9f065b0088709e94a Mon Sep 17 00:00:00 2001 From: thib92 Date: Wed, 18 Sep 2019 16:30:58 +0200 Subject: [PATCH 6/8] Use NoopLoader --- .../healthchecks/__tests__/androidHomeEnvVariable.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts index ce2d58ace..41246d3ca 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts +++ b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts @@ -1,6 +1,7 @@ import androidHomeEnvVariables from '../androidHomeEnvVariable'; import getEnvironmentInfo from '../../../../tools/envinfo'; import {EnvironmentInfo} from '../../types'; +import {NoopLoader} from '../../../../tools/loader'; jest.mock('../common'); @@ -34,9 +35,7 @@ describe('androidHomeEnvVariables', () => { }); it('logs manual installation steps to the screen', async () => { - const loader: any = { - info: jest.fn(), - }; + const loader = new NoopLoader(); const environmentInfo: EnvironmentInfo = JSON.parse( await getEnvironmentInfo(), From 22e1c41591416779d6efeac9b2ea646fd53efa57 Mon Sep 17 00:00:00 2001 From: thib92 Date: Sat, 21 Sep 2019 19:51:47 +0200 Subject: [PATCH 7/8] PR review @thymikee --- packages/cli/src/commands/doctor/doctor.ts | 7 ++--- .../__tests__/androidHomeEnvVariable.test.ts | 28 ++++++++----------- packages/cli/src/tools/envinfo.ts | 26 +++++++++-------- 3 files changed, 27 insertions(+), 34 deletions(-) diff --git a/packages/cli/src/commands/doctor/doctor.ts b/packages/cli/src/commands/doctor/doctor.ts index a86a9e52b..92e7e0b90 100644 --- a/packages/cli/src/commands/doctor/doctor.ts +++ b/packages/cli/src/commands/doctor/doctor.ts @@ -57,7 +57,7 @@ export default (async (_, __, options) => { loader.start('Running diagnostics...'); - const environmentInfo = JSON.parse(await getEnvironmentInfo()); + const environmentInfo = await getEnvironmentInfo(); const iterateOverHealthChecks = async ({ label, @@ -117,10 +117,7 @@ export default (async (_, __, options) => { }; healthchecksPerCategory.forEach((issueCategory, key) => { - printCategory({ - ...issueCategory, - key, - }); + printCategory({...issueCategory, key}); issueCategory.healthchecks.forEach(healthcheck => { printIssue(healthcheck); diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts index 41246d3ca..2d7b2c450 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts +++ b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts @@ -3,19 +3,22 @@ import getEnvironmentInfo from '../../../../tools/envinfo'; import {EnvironmentInfo} from '../../types'; import {NoopLoader} from '../../../../tools/loader'; -jest.mock('../common'); +import * as common from '../common'; -import {logManualInstallation} from '../common'; +const logSpy = jest.spyOn(common, 'logManualInstallation'); describe('androidHomeEnvVariables', () => { const OLD_ENV = process.env; + afterEach(() => { + process.env = OLD_ENV; + jest.resetAllMocks(); + }); + it('returns a message if no ANDROID_HOME is defined', async () => { delete process.env.ANDROID_HOME; - const environmentInfo: EnvironmentInfo = JSON.parse( - await getEnvironmentInfo(), - ); + const environmentInfo: EnvironmentInfo = await getEnvironmentInfo(); const diagnostics = await androidHomeEnvVariables.getDiagnostics( environmentInfo, ); @@ -25,9 +28,7 @@ describe('androidHomeEnvVariables', () => { it('returns false if ANDROID_HOME is defined', async () => { process.env.ANDROID_HOME = '/fake/path/to/android/home'; - const environmentInfo: EnvironmentInfo = JSON.parse( - await getEnvironmentInfo(), - ); + const environmentInfo: EnvironmentInfo = await getEnvironmentInfo(); const diagnostics = await androidHomeEnvVariables.getDiagnostics( environmentInfo, ); @@ -37,17 +38,10 @@ describe('androidHomeEnvVariables', () => { it('logs manual installation steps to the screen', async () => { const loader = new NoopLoader(); - const environmentInfo: EnvironmentInfo = JSON.parse( - await getEnvironmentInfo(), - ); + const environmentInfo: EnvironmentInfo = await getEnvironmentInfo(); androidHomeEnvVariables.runAutomaticFix({loader, environmentInfo}); - expect(logManualInstallation).toHaveBeenCalledTimes(1); - }); - - afterEach(() => { - process.env = OLD_ENV; - jest.resetAllMocks(); + expect(logSpy).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/cli/src/tools/envinfo.ts b/packages/cli/src/tools/envinfo.ts index 4a2912aaf..650afc33b 100644 --- a/packages/cli/src/tools/envinfo.ts +++ b/packages/cli/src/tools/envinfo.ts @@ -2,17 +2,19 @@ import envinfo from 'envinfo'; export default async function getEnvironmentInfo() { - return envinfo.run( - { - Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], - IDEs: ['Xcode', 'Android Studio'], - SDKs: ['iOS SDK', 'Android SDK'], - npmPackages: ['react', 'react-native', '@react-native-community/cli'], - npmGlobalPackages: ['*react-native*'], - }, - { - json: true, - showNotFound: true, - }, + return JSON.parse( + await envinfo.run( + { + Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], + IDEs: ['Xcode', 'Android Studio'], + SDKs: ['iOS SDK', 'Android SDK'], + npmPackages: ['react', 'react-native', '@react-native-community/cli'], + npmGlobalPackages: ['*react-native*'], + }, + { + json: true, + showNotFound: true, + }, + ), ); } From e55569d34bbef37af7c3f520af2c7b33bb48e045 Mon Sep 17 00:00:00 2001 From: thib92 Date: Sun, 22 Sep 2019 02:47:42 +0200 Subject: [PATCH 8/8] Return type for getEnvironmentInfo --- .../healthchecks/__tests__/androidHomeEnvVariable.test.ts | 7 +++---- packages/cli/src/tools/envinfo.ts | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts index 2d7b2c450..37362ed54 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts +++ b/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts @@ -1,6 +1,5 @@ import androidHomeEnvVariables from '../androidHomeEnvVariable'; import getEnvironmentInfo from '../../../../tools/envinfo'; -import {EnvironmentInfo} from '../../types'; import {NoopLoader} from '../../../../tools/loader'; import * as common from '../common'; @@ -18,7 +17,7 @@ describe('androidHomeEnvVariables', () => { it('returns a message if no ANDROID_HOME is defined', async () => { delete process.env.ANDROID_HOME; - const environmentInfo: EnvironmentInfo = await getEnvironmentInfo(); + const environmentInfo = await getEnvironmentInfo(); const diagnostics = await androidHomeEnvVariables.getDiagnostics( environmentInfo, ); @@ -28,7 +27,7 @@ describe('androidHomeEnvVariables', () => { it('returns false if ANDROID_HOME is defined', async () => { process.env.ANDROID_HOME = '/fake/path/to/android/home'; - const environmentInfo: EnvironmentInfo = await getEnvironmentInfo(); + const environmentInfo = await getEnvironmentInfo(); const diagnostics = await androidHomeEnvVariables.getDiagnostics( environmentInfo, ); @@ -38,7 +37,7 @@ describe('androidHomeEnvVariables', () => { it('logs manual installation steps to the screen', async () => { const loader = new NoopLoader(); - const environmentInfo: EnvironmentInfo = await getEnvironmentInfo(); + const environmentInfo = await getEnvironmentInfo(); androidHomeEnvVariables.runAutomaticFix({loader, environmentInfo}); diff --git a/packages/cli/src/tools/envinfo.ts b/packages/cli/src/tools/envinfo.ts index 650afc33b..f6f696a90 100644 --- a/packages/cli/src/tools/envinfo.ts +++ b/packages/cli/src/tools/envinfo.ts @@ -1,5 +1,6 @@ // @ts-ignore import envinfo from 'envinfo'; +import {EnvironmentInfo} from '../commands/doctor/types'; export default async function getEnvironmentInfo() { return JSON.parse( @@ -16,5 +17,5 @@ export default async function getEnvironmentInfo() { showNotFound: true, }, ), - ); + ) as EnvironmentInfo; }