diff --git a/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart b/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart index e08093bc..ddc9bc72 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/patch_command.dart @@ -321,14 +321,13 @@ NOTE: this is ${styleBold.wrap('not')} recommended. Asset changes cannot be incl baseMetadata, ); - await codePushClientWrapper.publishPatch( + await patcher.uploadPatchArtifacts( appId: appId, releaseId: release.id, metadata: updateMetadata.toJson(), - platform: patcher.releaseType.releasePlatform, track: isStaging ? DeploymentTrack.staging : DeploymentTrack.production, - patchArtifactBundles: patchArtifactBundles, + artifacts: patchArtifactBundles, ); }, values: { diff --git a/packages/shorebird_cli/lib/src/commands/patch/patcher.dart b/packages/shorebird_cli/lib/src/commands/patch/patcher.dart index 081ef8ea..ecf469a9 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/patcher.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/patcher.dart @@ -7,6 +7,7 @@ import 'package:mason_logger/mason_logger.dart'; import 'package:path/path.dart' as p; import 'package:shorebird_cli/src/code_push_client_wrapper.dart'; import 'package:shorebird_cli/src/common_arguments.dart'; +import 'package:shorebird_cli/src/deployment_track.dart'; import 'package:shorebird_cli/src/extensions/iterable.dart'; import 'package:shorebird_cli/src/metadata/metadata.dart'; import 'package:shorebird_cli/src/patch_diff_checker.dart'; @@ -73,7 +74,7 @@ ${iOSLinkPercentageUrl.toLink()} required File patchArchive, }); - /// Builds the release artifacts for the given platform. Returns the "primary" + /// Builds the patch artifacts for the given platform. Returns the "primary" /// artifact for the platform (e.g. the AAB for Android, the IPA for iOS). Future buildPatchArtifact({String? releaseVersion}); @@ -94,6 +95,24 @@ ${iOSLinkPercentageUrl.toLink()} return metadata; } + /// Uploads the patch artifacts to the CodePush server. + Future uploadPatchArtifacts({ + required String appId, + required int releaseId, + required Map metadata, + required Map artifacts, + required DeploymentTrack track, + }) async { + await codePushClientWrapper.publishPatch( + appId: appId, + releaseId: releaseId, + metadata: metadata, + platform: releaseType.releasePlatform, + track: track, + patchArtifactBundles: artifacts, + ); + } + /// Whether to allow changes in assets (--allow-asset-diffs). bool get allowAssetDiffs => argResults['allow-asset-diffs'] == true; diff --git a/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart b/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart index 24aab0d4..5df2d08b 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patch_command_test.dart @@ -159,10 +159,12 @@ void main() { when(() => argResults['platforms']).thenReturn(['android']); when(() => argResults['release-version']).thenReturn(releaseVersion); when(() => argResults.wasParsed(any())).thenReturn(true); - when(() => argResults.wasParsed(CommonArguments.privateKeyArg.name)) - .thenReturn(false); - when(() => argResults.wasParsed(CommonArguments.publicKeyArg.name)) - .thenReturn(false); + when( + () => argResults.wasParsed(CommonArguments.privateKeyArg.name), + ).thenReturn(false); + when( + () => argResults.wasParsed(CommonArguments.publicKeyArg.name), + ).thenReturn(false); when(aotTools.isLinkDebugInfoSupported).thenAnswer((_) async => true); @@ -172,23 +174,24 @@ void main() { when(() => cache.updateAll()).thenAnswer((_) async => {}); - when(() => codePushClientWrapper.getApp(appId: any(named: 'appId'))) - .thenAnswer((_) async => appMetadata); + when( + () => codePushClientWrapper.getApp(appId: any(named: 'appId')), + ).thenAnswer((_) async => appMetadata); when( () => codePushClientWrapper.getRelease( appId: any(named: 'appId'), releaseVersion: any(named: 'releaseVersion'), ), ).thenAnswer((_) async => release); - when(() => codePushClientWrapper.getReleases(appId: any(named: 'appId'))) - .thenAnswer((_) async => [release]); when( - () => codePushClientWrapper.publishPatch( + () => codePushClientWrapper.getReleases(appId: any(named: 'appId')), + ).thenAnswer((_) async => [release]); + when( + () => patcher.uploadPatchArtifacts( appId: any(named: 'appId'), releaseId: any(named: 'releaseId'), - platform: any(named: 'platform'), track: any(named: 'track'), - patchArtifactBundles: any(named: 'patchArtifactBundles'), + artifacts: any(named: 'artifacts'), metadata: any(named: 'metadata'), ), ).thenAnswer((_) async {}); @@ -298,13 +301,12 @@ void main() { await runWithOverrides(() => command.createPatch(patcher)); verify( - () => codePushClientWrapper.publishPatch( + () => patcher.uploadPatchArtifacts( appId: appId, releaseId: any(named: 'releaseId'), metadata: any(named: 'metadata'), - platform: any(named: 'platform'), track: any(named: 'track'), - patchArtifactBundles: patchArtifactBundles, + artifacts: patchArtifactBundles, ), ).called(1); }); @@ -601,12 +603,11 @@ void main() { ), () => logger.confirm('Would you like to continue?'), () => patcher.updatedCreatePatchMetadata(any()), - () => codePushClientWrapper.publishPatch( + () => patcher.uploadPatchArtifacts( appId: appId, releaseId: release.id, metadata: patchMetadata.toJson(), - platform: releasePlatform, - patchArtifactBundles: any(named: 'patchArtifactBundles'), + artifacts: any(named: 'artifacts'), track: DeploymentTrack.production, ), ]); @@ -652,12 +653,11 @@ void main() { releaseArtifact: any(named: 'releaseArtifact'), ), () => logger.confirm('Would you like to continue?'), - () => codePushClientWrapper.publishPatch( + () => patcher.uploadPatchArtifacts( appId: appId, releaseId: release.id, metadata: any(named: 'metadata'), - platform: releasePlatform, - patchArtifactBundles: any(named: 'patchArtifactBundles'), + artifacts: any(named: 'artifacts'), track: DeploymentTrack.production, ), ]); @@ -774,12 +774,11 @@ void main() { verifyNever(() => logger.confirm(any())); verifyNever( - () => codePushClientWrapper.publishPatch( + () => patcher.uploadPatchArtifacts( appId: appId, releaseId: release.id, metadata: any(named: 'metadata'), - platform: releasePlatform, - patchArtifactBundles: any(named: 'patchArtifactBundles'), + artifacts: any(named: 'artifacts'), track: DeploymentTrack.production, ), ); @@ -958,12 +957,11 @@ Please re-run the release command for this version or create a new release.''', expect(exitCode, equals(ExitCode.success.code)); verify( - () => codePushClientWrapper.publishPatch( + () => patcher.uploadPatchArtifacts( appId: appId, releaseId: release.id, metadata: any(named: 'metadata'), - platform: releasePlatform, - patchArtifactBundles: any(named: 'patchArtifactBundles'), + artifacts: any(named: 'artifacts'), track: DeploymentTrack.staging, ), ).called(1); diff --git a/packages/shorebird_cli/test/src/commands/patch/patcher_test.dart b/packages/shorebird_cli/test/src/commands/patch/patcher_test.dart index cc9c2ca7..f96fb156 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patcher_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patcher_test.dart @@ -2,19 +2,26 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:scoped_deps/scoped_deps.dart'; import 'package:shorebird_cli/src/code_push_client_wrapper.dart'; import 'package:shorebird_cli/src/commands/commands.dart'; import 'package:shorebird_cli/src/common_arguments.dart'; +import 'package:shorebird_cli/src/deployment_track.dart'; import 'package:shorebird_cli/src/patch_diff_checker.dart'; import 'package:shorebird_cli/src/platform/platform.dart'; import 'package:shorebird_cli/src/release_type.dart'; -import 'package:shorebird_code_push_protocol/src/models/release_artifact.dart'; +import 'package:shorebird_code_push_client/shorebird_code_push_client.dart'; import 'package:test/test.dart'; import '../../mocks.dart'; void main() { group(Patcher, () { + setUpAll(() { + registerFallbackValue(ReleasePlatform.android); + registerFallbackValue(DeploymentTrack.production); + }); + group('linkPercentage', () { test('defaults to null', () { expect( @@ -153,6 +160,60 @@ void main() { }); }); }); + + group('uploadPatchArtifacts', () { + test( + 'calls codePushClientWrapper.publishPatch ' + 'with correct args', () async { + final args = MockArgResults(); + final patcher = _TestPatcher( + argResults: args, + flavor: null, + target: null, + releaseType: ReleaseType.android, + ); + const appId = 'test_app_id'; + const releaseId = 42; + const metadata = {}; + const artifacts = {}; + const track = DeploymentTrack.production; + final codePushClientWrapper = MockCodePushClientWrapper(); + when( + () => codePushClientWrapper.publishPatch( + appId: any(named: 'appId'), + releaseId: any(named: 'releaseId'), + metadata: any(named: 'metadata'), + platform: any(named: 'platform'), + track: any(named: 'track'), + patchArtifactBundles: any(named: 'patchArtifactBundles'), + ), + ).thenAnswer((_) async {}); + await runScoped( + () async { + await patcher.uploadPatchArtifacts( + appId: appId, + releaseId: releaseId, + metadata: metadata, + artifacts: artifacts, + track: track, + ); + }, + values: { + codePushClientWrapperRef.overrideWith(() => codePushClientWrapper), + }, + ); + verify( + () => codePushClientWrapper.publishPatch( + appId: appId, + releaseId: releaseId, + metadata: metadata, + platform: ReleaseType.android.releasePlatform, + track: track, + patchArtifactBundles: artifacts, + ), + ).called(1); + }); + }); }); } @@ -161,7 +222,10 @@ class _TestPatcher extends Patcher { required super.argResults, required super.flavor, required super.target, - }); + ReleaseType? releaseType, + }) : _releaseType = releaseType; + + final ReleaseType? _releaseType; @override Future assertPreconditions() { @@ -200,5 +264,8 @@ class _TestPatcher extends Patcher { String get primaryReleaseArtifactArch => throw UnimplementedError(); @override - ReleaseType get releaseType => throw UnimplementedError(); + ReleaseType get releaseType { + if (_releaseType != null) return _releaseType; + throw UnimplementedError(); + } }