feat(shorebird_cli): add getApps and getReleases to CodePushClientWrapper (#834)

This commit is contained in:
Felix Angelov
2023-07-11 16:56:33 -04:00
committed by GitHub
parent caeb76ed2d
commit 4ff6778d1a
2 changed files with 84 additions and 19 deletions
@@ -60,6 +60,18 @@ class CodePushClientWrapper {
final CodePushClient codePushClient;
Future<List<AppMetadata>> 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<AppMetadata> 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<AppMetadata?> 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<List<Release>> 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<Release?> maybeGetRelease({
required String appId,
required String releaseVersion,
}) async {
final List<Release> 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<Release> createRelease({
@@ -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';