From 4ff6778d1ad4b2b58e944ea515d20e2034f24eae Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Tue, 11 Jul 2023 16:56:33 -0400 Subject: [PATCH] feat(shorebird_cli): add `getApps` and `getReleases` to `CodePushClientWrapper` (#834) --- .../lib/src/code_push_client_wrapper.dart | 47 +++++++++------- .../src/code_push_client_wrapper_test.dart | 56 +++++++++++++++++++ 2 files changed, 84 insertions(+), 19 deletions(-) diff --git a/packages/shorebird_cli/lib/src/code_push_client_wrapper.dart b/packages/shorebird_cli/lib/src/code_push_client_wrapper.dart index 41fefc36..db748528 100644 --- a/packages/shorebird_cli/lib/src/code_push_client_wrapper.dart +++ b/packages/shorebird_cli/lib/src/code_push_client_wrapper.dart @@ -60,6 +60,18 @@ class CodePushClientWrapper { final CodePushClient codePushClient; + Future> getApps() async { + final fetchAppsProgress = logger.progress('Fetching apps'); + try { + final apps = (await codePushClient.getApps()).toList(); + fetchAppsProgress.complete(); + return apps; + } catch (error) { + fetchAppsProgress.fail('$error'); + exit(ExitCode.software.code); + } + } + Future getApp({required String appId}) async { final app = await maybeGetApp(appId: appId); if (app == null) { @@ -75,15 +87,8 @@ This app may not exist or you may not have permission to view it.''', } Future maybeGetApp({required String appId}) async { - final fetchAppsProgress = logger.progress('Fetching apps'); - try { - final apps = (await codePushClient.getApps()).toList(); - fetchAppsProgress.complete(); - return apps.firstWhereOrNull((a) => a.appId == appId); - } catch (error) { - fetchAppsProgress.fail('$error'); - exit(ExitCode.software.code); - } + final apps = await getApps(); + return apps.firstWhereOrNull((a) => a.appId == appId); } @visibleForTesting @@ -177,20 +182,24 @@ Please create a release using "shorebird release" and try again. return release; } + Future> getReleases({required String appId}) async { + final fetchReleasesProgress = logger.progress('Fetching releases'); + try { + final releases = await codePushClient.getReleases(appId: appId); + fetchReleasesProgress.complete(); + return releases; + } catch (error) { + fetchReleasesProgress.fail('$error'); + exit(ExitCode.software.code); + } + } + Future maybeGetRelease({ required String appId, required String releaseVersion, }) async { - final List releases; - final fetchReleaseProgress = logger.progress('Fetching release'); - try { - releases = await codePushClient.getReleases(appId: appId); - fetchReleaseProgress.complete(); - return releases.firstWhereOrNull((r) => r.version == releaseVersion); - } catch (error) { - fetchReleaseProgress.fail('$error'); - exit(ExitCode.software.code); - } + final releases = await getReleases(appId: appId); + return releases.firstWhereOrNull((r) => r.version == releaseVersion); } Future createRelease({ diff --git a/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart b/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart index c8df141d..f042ae2e 100644 --- a/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart +++ b/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart @@ -155,6 +155,32 @@ void main() { }); group('app', () { + group('getApps', () { + test('exits with code 70 when getting apps fails', () async { + const error = 'something went wrong'; + when(() => codePushClient.getApps()).thenThrow(error); + + await expectLater( + () async => runWithOverrides( + () => codePushClientWrapper.getApps(), + ), + exitsWithCode(ExitCode.software), + ); + verify(() => progress.fail(error)).called(1); + }); + + test('returns apps on success', () async { + when(() => codePushClient.getApps()).thenAnswer((_) async => [app]); + + final apps = await runWithOverrides( + () => codePushClientWrapper.getApps(), + ); + + expect(apps, equals([app])); + verify(() => progress.complete()).called(1); + }); + }); + group('getApp', () { test('exits with code 70 when getting app fails', () async { const error = 'something went wrong'; @@ -389,6 +415,36 @@ Please bump your version number and try again.''', ); }); + group('getReleases', () { + test('exits with code 70 when fetching release fails', () async { + const error = 'something went wrong'; + when( + () => codePushClient.getReleases(appId: any(named: 'appId')), + ).thenThrow(error); + + await expectLater( + () async => runWithOverrides( + () => codePushClientWrapper.getReleases(appId: appId), + ), + exitsWithCode(ExitCode.software), + ); + verify(() => progress.fail(error)).called(1); + }); + + test('returns releases on success', () async { + when( + () => codePushClient.getReleases(appId: any(named: 'appId')), + ).thenAnswer((_) async => [release]); + + final releases = await runWithOverrides( + () => codePushClientWrapper.getReleases(appId: appId), + ); + + expect(releases, equals([release])); + verify(() => progress.complete()).called(1); + }); + }); + group('getRelease', () { test('exits with code 70 when fetching release fails', () async { const error = 'something went wrong';