feat(shorebird_code_push_protocol): add platformStatuses to Release (#872)
This commit is contained in:
@@ -208,6 +208,7 @@ Please create a release using "shorebird release" and try again.
|
||||
required String appId,
|
||||
required String version,
|
||||
required String flutterRevision,
|
||||
required ReleasePlatform platform,
|
||||
}) async {
|
||||
final createReleaseProgress = logger.progress('Creating release');
|
||||
try {
|
||||
@@ -216,6 +217,12 @@ Please create a release using "shorebird release" and try again.
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
);
|
||||
await codePushClient.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.draft,
|
||||
);
|
||||
createReleaseProgress.complete();
|
||||
return release;
|
||||
} catch (error) {
|
||||
@@ -224,6 +231,27 @@ Please create a release using "shorebird release" and try again.
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> updateReleaseStatus({
|
||||
required String appId,
|
||||
required int releaseId,
|
||||
required ReleasePlatform platform,
|
||||
required ReleaseStatus status,
|
||||
}) async {
|
||||
final updateStatusProgress = logger.progress('Updating release status');
|
||||
try {
|
||||
await codePushClient.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: releaseId,
|
||||
platform: platform,
|
||||
status: status,
|
||||
);
|
||||
updateStatusProgress.complete();
|
||||
} catch (error) {
|
||||
updateStatusProgress.fail();
|
||||
exit(ExitCode.software.code);
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<Arch, ReleaseArtifact>> getReleaseArtifacts({
|
||||
required String appId,
|
||||
required int releaseId,
|
||||
@@ -490,28 +518,6 @@ aar artifact already exists, continuing...''',
|
||||
createArtifactProgress.complete();
|
||||
}
|
||||
|
||||
/// Updates the specified release's status to [ReleaseStatus.active] for the
|
||||
/// given platform.
|
||||
Future<void> completeRelease({
|
||||
required String appId,
|
||||
required int releaseId,
|
||||
required ReleasePlatform platform,
|
||||
}) async {
|
||||
final completeReleaseProgress = logger.progress('Completing release');
|
||||
try {
|
||||
await codePushClient.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: releaseId,
|
||||
status: ReleaseStatus.active,
|
||||
platform: platform,
|
||||
);
|
||||
} catch (error) {
|
||||
completeReleaseProgress.fail('$error');
|
||||
exit(ExitCode.software.code);
|
||||
}
|
||||
completeReleaseProgress.complete();
|
||||
}
|
||||
|
||||
@visibleForTesting
|
||||
Future<Patch> createPatch({
|
||||
required String appId,
|
||||
|
||||
@@ -158,12 +158,23 @@ ${summary.join('\n')}
|
||||
return ExitCode.software.code;
|
||||
}
|
||||
|
||||
final release = existingRelease ??
|
||||
await codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: shorebirdFlutterRevision,
|
||||
);
|
||||
final Release release;
|
||||
if (existingRelease != null) {
|
||||
release = existingRelease;
|
||||
await codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.draft,
|
||||
);
|
||||
} else {
|
||||
release = await codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: shorebirdFlutterRevision,
|
||||
platform: platform,
|
||||
);
|
||||
}
|
||||
|
||||
final extractAarProgress = logger.progress('Creating artifacts');
|
||||
final extractedAarDir = await extractAar(
|
||||
@@ -185,10 +196,11 @@ ${summary.join('\n')}
|
||||
architectures: architectures,
|
||||
);
|
||||
|
||||
await codePushClientWrapper.completeRelease(
|
||||
await codePushClientWrapper.updateReleaseStatus(
|
||||
appId: app.appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.active,
|
||||
);
|
||||
|
||||
logger
|
||||
|
||||
@@ -166,12 +166,23 @@ ${summary.join('\n')}
|
||||
return ExitCode.software.code;
|
||||
}
|
||||
|
||||
final release = existingRelease ??
|
||||
await codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: shorebirdFlutterRevision,
|
||||
);
|
||||
final Release release;
|
||||
if (existingRelease != null) {
|
||||
release = existingRelease;
|
||||
await codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.draft,
|
||||
);
|
||||
} else {
|
||||
release = await codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: shorebirdFlutterRevision,
|
||||
platform: platform,
|
||||
);
|
||||
}
|
||||
|
||||
await codePushClientWrapper.createAndroidReleaseArtifacts(
|
||||
appId: app.appId,
|
||||
@@ -182,10 +193,11 @@ ${summary.join('\n')}
|
||||
flavor: flavor,
|
||||
);
|
||||
|
||||
await codePushClientWrapper.completeRelease(
|
||||
await codePushClientWrapper.updateReleaseStatus(
|
||||
appId: app.appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.active,
|
||||
);
|
||||
|
||||
logger
|
||||
|
||||
@@ -161,12 +161,23 @@ ${summary.join('\n')}
|
||||
return ExitCode.software.code;
|
||||
}
|
||||
|
||||
final release = existingRelease ??
|
||||
await codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: shorebirdFlutterRevision,
|
||||
);
|
||||
final Release release;
|
||||
if (existingRelease != null) {
|
||||
release = existingRelease;
|
||||
await codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.draft,
|
||||
);
|
||||
} else {
|
||||
release = await codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: shorebirdFlutterRevision,
|
||||
platform: platform,
|
||||
);
|
||||
}
|
||||
|
||||
final relativeIpaPath = p.relative(ipaPath);
|
||||
|
||||
@@ -176,10 +187,11 @@ ${summary.join('\n')}
|
||||
ipaPath: ipaPath,
|
||||
);
|
||||
|
||||
await codePushClientWrapper.completeRelease(
|
||||
await codePushClientWrapper.updateReleaseStatus(
|
||||
appId: app.appId,
|
||||
releaseId: release.id,
|
||||
platform: platform,
|
||||
status: ReleaseStatus.active,
|
||||
);
|
||||
|
||||
logger
|
||||
|
||||
@@ -33,6 +33,7 @@ void main() {
|
||||
|
||||
setUpAll(() {
|
||||
registerFallbackValue(ReleasePlatform.android);
|
||||
registerFallbackValue(ReleaseStatus.draft);
|
||||
});
|
||||
|
||||
setUp(() {
|
||||
@@ -90,6 +91,7 @@ void main() {
|
||||
version: releaseVersion,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: displayName,
|
||||
platformStatuses: {},
|
||||
);
|
||||
final partchArtifactBundle = PatchArtifactBundle(
|
||||
arch: arch.name,
|
||||
@@ -582,6 +584,7 @@ Please bump your version number and try again.''',
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: flutterRevision,
|
||||
platform: releasePlatform,
|
||||
),
|
||||
),
|
||||
exitsWithCode(ExitCode.software),
|
||||
@@ -597,62 +600,33 @@ Please bump your version number and try again.''',
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
),
|
||||
).thenAnswer((_) async => release);
|
||||
when(
|
||||
() => codePushClient.updateReleaseStatus(
|
||||
appId: any(named: 'appId'),
|
||||
releaseId: any(named: 'releaseId'),
|
||||
platform: any(named: 'platform'),
|
||||
status: any(named: 'status'),
|
||||
),
|
||||
).thenAnswer((_) async => {});
|
||||
|
||||
final result = await runWithOverrides(
|
||||
() async => codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: flutterRevision,
|
||||
platform: releasePlatform,
|
||||
),
|
||||
);
|
||||
|
||||
expect(result, release);
|
||||
verify(() => progress.complete()).called(1);
|
||||
});
|
||||
});
|
||||
|
||||
group('createRelease', () {
|
||||
test('exits with code 70 when creating release fails', () async {
|
||||
const error = 'something went wrong';
|
||||
when(
|
||||
() => codePushClient.createRelease(
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
),
|
||||
).thenThrow(error);
|
||||
|
||||
await expectLater(
|
||||
() async => runWithOverrides(
|
||||
() async => codePushClientWrapper.createRelease(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: flutterRevision,
|
||||
),
|
||||
),
|
||||
exitsWithCode(ExitCode.software),
|
||||
);
|
||||
verify(() => progress.fail(error)).called(1);
|
||||
});
|
||||
|
||||
test('returns release when release is successfully created', () async {
|
||||
when(
|
||||
() => codePushClient.createRelease(
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
),
|
||||
).thenAnswer((_) async => release);
|
||||
|
||||
final result = await runWithOverrides(
|
||||
() async => codePushClientWrapper.createRelease(
|
||||
verify(
|
||||
() => codePushClient.updateReleaseStatus(
|
||||
appId: appId,
|
||||
version: releaseVersion,
|
||||
flutterRevision: flutterRevision,
|
||||
releaseId: result.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.draft,
|
||||
),
|
||||
);
|
||||
|
||||
expect(result, release);
|
||||
).called(1);
|
||||
verify(() => progress.complete()).called(1);
|
||||
});
|
||||
});
|
||||
@@ -1535,11 +1509,7 @@ Please bump your version number and try again.''',
|
||||
});
|
||||
});
|
||||
|
||||
group('completeRelease', () {
|
||||
setUp(() {
|
||||
registerFallbackValue(ReleaseStatus.active);
|
||||
});
|
||||
|
||||
group('updateReleaseStatus', () {
|
||||
test(
|
||||
'exits with code 70 when updating release status fails',
|
||||
() async {
|
||||
@@ -1554,10 +1524,11 @@ Please bump your version number and try again.''',
|
||||
|
||||
await expectLater(
|
||||
() async => runWithOverrides(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: app.appId,
|
||||
releaseId: releaseId,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
),
|
||||
exitsWithCode(ExitCode.software),
|
||||
@@ -1576,13 +1547,22 @@ Please bump your version number and try again.''',
|
||||
).thenAnswer((_) async => {});
|
||||
|
||||
await runWithOverrides(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: app.appId,
|
||||
releaseId: releaseId,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
);
|
||||
|
||||
verify(
|
||||
() => codePushClient.updateReleaseStatus(
|
||||
appId: app.appId,
|
||||
releaseId: releaseId,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
verify(() => progress.complete()).called(1);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -88,6 +88,7 @@ void main() {
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: '1.2.3+1',
|
||||
platformStatuses: {},
|
||||
);
|
||||
const noModulePubspecYamlContent = '''
|
||||
name: example
|
||||
|
||||
@@ -93,6 +93,7 @@ void main() {
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: '1.2.3+1',
|
||||
platformStatuses: {},
|
||||
);
|
||||
const pubspecYamlContent = '''
|
||||
name: example
|
||||
|
||||
@@ -87,6 +87,7 @@ flutter:
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: '1.2.3+1',
|
||||
platformStatuses: {},
|
||||
);
|
||||
|
||||
group(PatchIosCommand, () {
|
||||
|
||||
@@ -60,6 +60,7 @@ void main() {
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: '1.2.3+1',
|
||||
platformStatuses: {},
|
||||
);
|
||||
|
||||
const releasePlatform = ReleasePlatform.android;
|
||||
@@ -161,6 +162,7 @@ flutter:
|
||||
|
||||
setUpAll(() {
|
||||
registerFallbackValue(ReleasePlatform.android);
|
||||
registerFallbackValue(ReleaseStatus.draft);
|
||||
});
|
||||
|
||||
setUp(() {
|
||||
@@ -249,6 +251,7 @@ flutter:
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
platform: any(named: 'platform'),
|
||||
),
|
||||
).thenAnswer((_) async => release);
|
||||
when(
|
||||
@@ -262,10 +265,11 @@ flutter:
|
||||
),
|
||||
).thenAnswer((_) async => {});
|
||||
when(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: any(named: 'appId'),
|
||||
releaseId: any(named: 'releaseId'),
|
||||
platform: any(named: 'platform'),
|
||||
status: any(named: 'status'),
|
||||
),
|
||||
).thenAnswer((_) async => {});
|
||||
|
||||
@@ -447,10 +451,11 @@ flutter:
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
@@ -505,10 +510,11 @@ flavors:
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
@@ -535,13 +541,15 @@ flavors:
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
platform: any(named: 'platform'),
|
||||
),
|
||||
);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
@@ -596,10 +604,11 @@ flavors:
|
||||
expect(exitCode, equals(ExitCode.config.code));
|
||||
verify(() => logger.err('Aborting due to validation errors.')).called(1);
|
||||
verifyNever(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -65,6 +65,7 @@ void main() {
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: '1.2.3+1',
|
||||
platformStatuses: {},
|
||||
);
|
||||
|
||||
const pubspecYamlContent = '''
|
||||
@@ -126,6 +127,7 @@ flutter:
|
||||
|
||||
setUpAll(() {
|
||||
registerFallbackValue(ReleasePlatform.android);
|
||||
registerFallbackValue(ReleaseStatus.draft);
|
||||
});
|
||||
|
||||
setUp(() {
|
||||
@@ -218,6 +220,7 @@ flutter:
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
platform: any(named: 'platform'),
|
||||
),
|
||||
).thenAnswer((_) async => release);
|
||||
when(
|
||||
@@ -231,10 +234,11 @@ flutter:
|
||||
),
|
||||
).thenAnswer((_) async {});
|
||||
when(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: any(named: 'appId'),
|
||||
releaseId: any(named: 'releaseId'),
|
||||
platform: any(named: 'platform'),
|
||||
status: any(named: 'status'),
|
||||
),
|
||||
).thenAnswer((_) async {});
|
||||
when(() => flutterValidator.validate(any())).thenAnswer((_) async => []);
|
||||
@@ -344,10 +348,11 @@ flutter:
|
||||
expect(exitCode, ExitCode.success.code);
|
||||
verify(() => logger.info('Aborting.')).called(1);
|
||||
verifyNever(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: any(named: 'appId'),
|
||||
releaseId: any(named: 'releaseId'),
|
||||
platform: any(named: 'platform'),
|
||||
status: any(named: 'status'),
|
||||
),
|
||||
);
|
||||
});
|
||||
@@ -409,10 +414,11 @@ flutter:
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
expect(exitCode, ExitCode.success.code);
|
||||
@@ -438,10 +444,11 @@ flutter:
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
expect(exitCode, ExitCode.success.code);
|
||||
@@ -479,10 +486,11 @@ flavors:
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
expect(exitCode, ExitCode.success.code);
|
||||
@@ -509,6 +517,7 @@ flavors:
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
platform: any(named: 'platform'),
|
||||
),
|
||||
);
|
||||
});
|
||||
@@ -563,10 +572,11 @@ flavors:
|
||||
expect(exitCode, equals(ExitCode.config.code));
|
||||
verify(() => logger.err('Aborting due to validation errors.')).called(1);
|
||||
verifyNever(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: any(named: 'appId'),
|
||||
releaseId: any(named: 'releaseId'),
|
||||
platform: any(named: 'platform'),
|
||||
status: any(named: 'status'),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -62,6 +62,7 @@ void main() {
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: '1.2.3+1',
|
||||
platformStatuses: {},
|
||||
);
|
||||
const infoPlistContent = '''
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
@@ -129,6 +130,7 @@ flutter:
|
||||
|
||||
setUpAll(() {
|
||||
registerFallbackValue(ReleasePlatform.ios);
|
||||
registerFallbackValue(ReleaseStatus.draft);
|
||||
});
|
||||
|
||||
setUp(() {
|
||||
@@ -217,6 +219,7 @@ flutter:
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
platform: any(named: 'platform'),
|
||||
),
|
||||
).thenAnswer((_) async => release);
|
||||
when(
|
||||
@@ -227,10 +230,11 @@ flutter:
|
||||
),
|
||||
).thenAnswer((_) async => release);
|
||||
when(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: any(named: 'appId'),
|
||||
releaseId: any(named: 'releaseId'),
|
||||
platform: any(named: 'platform'),
|
||||
status: any(named: 'status'),
|
||||
),
|
||||
).thenAnswer((_) async => {});
|
||||
|
||||
@@ -452,10 +456,11 @@ error: exportArchive: No signing certificate "iOS Distribution" found
|
||||
() => logger.prompt(any(), defaultValue: any(named: 'defaultValue')),
|
||||
);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
@@ -489,10 +494,11 @@ error: exportArchive: No signing certificate "iOS Distribution" found
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
expect(exitCode, ExitCode.success.code);
|
||||
@@ -562,6 +568,7 @@ flavors:
|
||||
appId: any(named: 'appId'),
|
||||
version: any(named: 'version'),
|
||||
flutterRevision: any(named: 'flutterRevision'),
|
||||
platform: any(named: 'platform'),
|
||||
),
|
||||
);
|
||||
verify(
|
||||
@@ -572,10 +579,11 @@ flavors:
|
||||
),
|
||||
).called(1);
|
||||
verify(
|
||||
() => codePushClientWrapper.completeRelease(
|
||||
() => codePushClientWrapper.updateReleaseStatus(
|
||||
appId: appId,
|
||||
releaseId: release.id,
|
||||
platform: releasePlatform,
|
||||
status: ReleaseStatus.active,
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
|
||||
@@ -92,6 +92,7 @@ flutter:
|
||||
version: '0.1.0',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: null,
|
||||
platformStatuses: {ReleasePlatform.android: ReleaseStatus.active},
|
||||
),
|
||||
const Release(
|
||||
id: 2,
|
||||
@@ -99,6 +100,7 @@ flutter:
|
||||
version: '0.1.1',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: null,
|
||||
platformStatuses: {},
|
||||
),
|
||||
const Release(
|
||||
id: releaseId,
|
||||
@@ -106,6 +108,7 @@ flutter:
|
||||
version: versionNumber,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: null,
|
||||
platformStatuses: {ReleasePlatform.android: ReleaseStatus.active},
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -155,6 +155,7 @@ flavors:
|
||||
version: '1.0.0',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: 'v1.0.0 (dev)',
|
||||
platformStatuses: {ReleasePlatform.ios: ReleaseStatus.draft},
|
||||
),
|
||||
],
|
||||
);
|
||||
@@ -187,6 +188,7 @@ flavors:
|
||||
version: '1.0.1',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: 'First',
|
||||
platformStatuses: {ReleasePlatform.ios: ReleaseStatus.active},
|
||||
),
|
||||
const Release(
|
||||
id: 1,
|
||||
@@ -194,6 +196,7 @@ flavors:
|
||||
version: '1.0.2',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: null,
|
||||
platformStatuses: {ReleasePlatform.ios: ReleaseStatus.draft},
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -303,7 +303,8 @@ class CodePushClient {
|
||||
throw _parseErrorResponse(response.statusCode, response.body);
|
||||
}
|
||||
final body = json.decode(response.body) as Map<String, dynamic>;
|
||||
return Release.fromJson(body);
|
||||
final createReleaseResponse = CreateReleaseResponse.fromJson(body);
|
||||
return createReleaseResponse.release;
|
||||
}
|
||||
|
||||
/// Updates the specified release's status to [status].
|
||||
|
||||
@@ -1109,12 +1109,15 @@ void main() {
|
||||
Stream.value(
|
||||
utf8.encode(
|
||||
json.encode(
|
||||
Release(
|
||||
id: releaseId,
|
||||
appId: appId,
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: displayName,
|
||||
CreateReleaseResponse(
|
||||
release: Release(
|
||||
id: releaseId,
|
||||
appId: appId,
|
||||
version: version,
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: displayName,
|
||||
platformStatuses: {},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -1141,7 +1144,12 @@ void main() {
|
||||
'flutterRevision',
|
||||
flutterRevision,
|
||||
)
|
||||
.having((r) => r.displayName, 'displayName', displayName),
|
||||
.having((r) => r.displayName, 'displayName', displayName)
|
||||
.having(
|
||||
(r) => r.platformStatuses,
|
||||
'platformStatuses',
|
||||
<ReleasePlatform, ReleaseStatus>{},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -1840,6 +1848,7 @@ void main() {
|
||||
version: '1.0.0',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: 'v1.0.0',
|
||||
platformStatuses: {ReleasePlatform.android: ReleaseStatus.draft},
|
||||
),
|
||||
Release(
|
||||
id: 1,
|
||||
@@ -1847,6 +1856,7 @@ void main() {
|
||||
version: '1.0.1',
|
||||
flutterRevision: flutterRevision,
|
||||
displayName: 'v1.0.1',
|
||||
platformStatuses: {},
|
||||
),
|
||||
];
|
||||
|
||||
|
||||
+4
-19
@@ -1,4 +1,5 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart';
|
||||
|
||||
part 'create_release_response.g.dart';
|
||||
|
||||
@@ -9,11 +10,7 @@ part 'create_release_response.g.dart';
|
||||
class CreateReleaseResponse {
|
||||
/// {@macro create_release_response}
|
||||
const CreateReleaseResponse({
|
||||
required this.id,
|
||||
required this.appId,
|
||||
required this.version,
|
||||
required this.flutterRevision,
|
||||
required this.displayName,
|
||||
required this.release,
|
||||
});
|
||||
|
||||
/// Converts a Map<String, dynamic> to a [CreateReleaseResponse]
|
||||
@@ -23,18 +20,6 @@ class CreateReleaseResponse {
|
||||
/// Converts a [CreateReleaseResponse] to a Map<String, dynamic>
|
||||
Map<String, dynamic> toJson() => _$CreateReleaseResponseToJson(this);
|
||||
|
||||
/// The ID of the release;
|
||||
final int id;
|
||||
|
||||
/// The ID of the app.
|
||||
final String appId;
|
||||
|
||||
/// The version of the release.
|
||||
final String version;
|
||||
|
||||
/// The Flutter revision used to create the release.
|
||||
final String flutterRevision;
|
||||
|
||||
/// The display name for the release
|
||||
final String? displayName;
|
||||
/// The newly-created release.
|
||||
final Release release;
|
||||
}
|
||||
|
||||
+3
-16
@@ -15,28 +15,15 @@ CreateReleaseResponse _$CreateReleaseResponseFromJson(
|
||||
json,
|
||||
($checkedConvert) {
|
||||
final val = CreateReleaseResponse(
|
||||
id: $checkedConvert('id', (v) => v as int),
|
||||
appId: $checkedConvert('app_id', (v) => v as String),
|
||||
version: $checkedConvert('version', (v) => v as String),
|
||||
flutterRevision:
|
||||
$checkedConvert('flutter_revision', (v) => v as String),
|
||||
displayName: $checkedConvert('display_name', (v) => v as String?),
|
||||
release: $checkedConvert(
|
||||
'release', (v) => Release.fromJson(v as Map<String, dynamic>)),
|
||||
);
|
||||
return val;
|
||||
},
|
||||
fieldKeyMap: const {
|
||||
'appId': 'app_id',
|
||||
'flutterRevision': 'flutter_revision',
|
||||
'displayName': 'display_name'
|
||||
},
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$CreateReleaseResponseToJson(
|
||||
CreateReleaseResponse instance) =>
|
||||
<String, dynamic>{
|
||||
'id': instance.id,
|
||||
'app_id': instance.appId,
|
||||
'version': instance.version,
|
||||
'flutter_revision': instance.flutterRevision,
|
||||
'display_name': instance.displayName,
|
||||
'release': instance.release.toJson(),
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart';
|
||||
|
||||
part 'release.g.dart';
|
||||
|
||||
@@ -15,6 +16,7 @@ class Release {
|
||||
required this.version,
|
||||
required this.flutterRevision,
|
||||
required this.displayName,
|
||||
required this.platformStatuses,
|
||||
});
|
||||
|
||||
/// Converts a Map<String, dynamic> to a [Release]
|
||||
@@ -38,4 +40,7 @@ class Release {
|
||||
|
||||
/// The display name for the release
|
||||
final String? displayName;
|
||||
|
||||
/// The status of the release for each platform.
|
||||
final Map<ReleasePlatform, ReleaseStatus> platformStatuses;
|
||||
}
|
||||
|
||||
@@ -19,13 +19,20 @@ Release _$ReleaseFromJson(Map<String, dynamic> json) => $checkedCreate(
|
||||
flutterRevision:
|
||||
$checkedConvert('flutter_revision', (v) => v as String),
|
||||
displayName: $checkedConvert('display_name', (v) => v as String?),
|
||||
platformStatuses: $checkedConvert(
|
||||
'platform_statuses',
|
||||
(v) => (v as Map<String, dynamic>).map(
|
||||
(k, e) => MapEntry($enumDecode(_$ReleasePlatformEnumMap, k),
|
||||
$enumDecode(_$ReleaseStatusEnumMap, e)),
|
||||
)),
|
||||
);
|
||||
return val;
|
||||
},
|
||||
fieldKeyMap: const {
|
||||
'appId': 'app_id',
|
||||
'flutterRevision': 'flutter_revision',
|
||||
'displayName': 'display_name'
|
||||
'displayName': 'display_name',
|
||||
'platformStatuses': 'platform_statuses'
|
||||
},
|
||||
);
|
||||
|
||||
@@ -35,4 +42,16 @@ Map<String, dynamic> _$ReleaseToJson(Release instance) => <String, dynamic>{
|
||||
'version': instance.version,
|
||||
'flutter_revision': instance.flutterRevision,
|
||||
'display_name': instance.displayName,
|
||||
'platform_statuses': instance.platformStatuses.map((k, e) =>
|
||||
MapEntry(_$ReleasePlatformEnumMap[k]!, _$ReleaseStatusEnumMap[e]!)),
|
||||
};
|
||||
|
||||
const _$ReleaseStatusEnumMap = {
|
||||
ReleaseStatus.draft: 'draft',
|
||||
ReleaseStatus.active: 'active',
|
||||
};
|
||||
|
||||
const _$ReleasePlatformEnumMap = {
|
||||
ReleasePlatform.android: 'android',
|
||||
ReleasePlatform.ios: 'ios',
|
||||
};
|
||||
|
||||
+8
-5
@@ -5,11 +5,14 @@ void main() {
|
||||
group(CreateReleaseResponse, () {
|
||||
test('can be (de)serialized', () {
|
||||
const response = CreateReleaseResponse(
|
||||
id: 0,
|
||||
appId: 'test-app-id',
|
||||
version: '1.0.0',
|
||||
displayName: 'v1.0.0',
|
||||
flutterRevision: 'flutter-revision',
|
||||
release: Release(
|
||||
id: 0,
|
||||
appId: 'test-app-id',
|
||||
version: '1.0.0',
|
||||
displayName: 'v1.0.0',
|
||||
flutterRevision: 'flutter-revision',
|
||||
platformStatuses: {},
|
||||
),
|
||||
);
|
||||
expect(
|
||||
CreateReleaseResponse.fromJson(response.toJson()).toJson(),
|
||||
|
||||
@@ -10,6 +10,7 @@ void main() {
|
||||
version: '1.0.0',
|
||||
flutterRevision: '83305b5088e6fe327fb3334a73ff190828d85713',
|
||||
displayName: 'v1.0.0',
|
||||
platformStatuses: {ReleasePlatform.android: ReleaseStatus.active},
|
||||
);
|
||||
expect(
|
||||
Release.fromJson(release.toJson()).toJson(),
|
||||
|
||||
Reference in New Issue
Block a user