From b93da1fd1bfb56a7daa2e8792cf57dd74caa74d3 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Fri, 10 May 2024 11:40:24 -0700 Subject: [PATCH] fix(shorebird_cli): forwarded arguments should exclude platform (#2077) --- .../lib/src/artifact_builder.dart | 20 +++---- .../src/commands/build/build_aar_command.dart | 3 +- .../src/commands/build/build_apk_command.dart | 3 +- .../build/build_app_bundle_command.dart | 3 +- .../src/commands/build/build_ipa_command.dart | 3 +- .../lib/src/commands/patch/aar_patcher.dart | 2 +- .../src/commands/patch/android_patcher.dart | 2 +- .../commands/patch/ios_framework_patcher.dart | 2 +- .../lib/src/commands/patch/ios_patcher.dart | 2 +- .../src/commands/release/aar_releaser.dart | 2 +- .../commands/release/android_releaser.dart | 4 +- .../release/ios_framework_releaser.dart | 4 +- .../src/commands/release/ios_releaser.dart | 2 +- .../shorebird_cli/lib/src/release_type.dart | 9 ++++ packages/shorebird_cli/pubspec.lock | 4 +- .../test/src/artifact_builder_test.dart | 12 ++--- .../build/build_aar_command_test.dart | 53 +++++++++++++++---- .../build/build_apk_command_test.dart | 37 +++++++++---- .../build/build_app_bundle_command_test.dart | 41 ++++++++++---- .../build/build_ipa_command_test.dart | 41 +++++++++++--- .../src/commands/patch/aar_patcher_test.dart | 42 +++++++++++++-- .../commands/patch/android_patcher_test.dart | 20 ++++++- .../patch/ios_framework_patcher_test.dart | 30 +++++++---- .../src/commands/patch/ios_patcher_test.dart | 28 ++++++++-- .../commands/release/aar_releaser_test.dart | 27 ++++++++-- .../release/android_releaser_test.dart | 35 +++++++++--- .../release/ios_framework_releaser_test.dart | 27 +++++++--- .../commands/release/ios_releaser_test.dart | 33 +++++++++++- 28 files changed, 384 insertions(+), 107 deletions(-) diff --git a/packages/shorebird_cli/lib/src/artifact_builder.dart b/packages/shorebird_cli/lib/src/artifact_builder.dart index 6fc1c33a..76d05104 100644 --- a/packages/shorebird_cli/lib/src/artifact_builder.dart +++ b/packages/shorebird_cli/lib/src/artifact_builder.dart @@ -42,7 +42,7 @@ class ArtifactBuilder { String? flavor, String? target, Iterable? targetPlatforms, - List argResultsRest = const [], + List args = const [], }) async { await _runShorebirdBuildCommand(() async { const executable = 'flutter'; @@ -54,7 +54,7 @@ class ArtifactBuilder { if (flavor != null) '--flavor=$flavor', if (target != null) '--target=$target', if (targetPlatformArgs != null) '--target-platform=$targetPlatformArgs', - ...argResultsRest, + ...args, ]; final result = await process.run( @@ -94,7 +94,7 @@ class ArtifactBuilder { String? target, Iterable? targetPlatforms, bool splitPerAbi = false, - List argResultsRest = const [], + List args = const [], }) async { await _runShorebirdBuildCommand(() async { const executable = 'flutter'; @@ -111,7 +111,7 @@ class ArtifactBuilder { // coverage:ignore-start if (splitPerAbi) '--split-per-abi', // coverage:ignore-end - ...argResultsRest, + ...args, ]; final result = await process.run( @@ -148,7 +148,7 @@ class ArtifactBuilder { Future buildAar({ required String buildNumber, Iterable? targetPlatforms, - List argResultsRest = const [], + List args = const [], }) async { return _runShorebirdBuildCommand(() async { const executable = 'flutter'; @@ -160,7 +160,7 @@ class ArtifactBuilder { '--no-profile', '--build-number=$buildNumber', if (targetPlatformArgs != null) '--target-platform=$targetPlatformArgs', - ...argResultsRest, + ...args, ]; final result = await process.run( @@ -182,7 +182,7 @@ class ArtifactBuilder { File? exportOptionsPlist, String? flavor, String? target, - List argResultsRest = const [], + List args = const [], }) async { return _runShorebirdBuildCommand(() async { const executable = 'flutter'; @@ -196,7 +196,7 @@ class ArtifactBuilder { if (target != null) '--target=$target', if (!codesign) '--no-codesign', if (codesign) '''--export-options-plist=$exportOptionsPlistPath''', - ...argResultsRest, + ...args, ]; final result = await process.run( @@ -225,7 +225,7 @@ $errorMessage'''); /// Builds a release iOS framework (.xcframework) for the current project. Future buildIosFramework({ - List argResultsRest = const [], + List args = const [], }) { return _runShorebirdBuildCommand(() async { const executable = 'flutter'; @@ -234,7 +234,7 @@ $errorMessage'''); 'ios-framework', '--no-debug', '--no-profile', - ...argResultsRest, + ...args, ]; final result = await process.run( diff --git a/packages/shorebird_cli/lib/src/commands/build/build_aar_command.dart b/packages/shorebird_cli/lib/src/commands/build/build_aar_command.dart index fc955333..512baffe 100644 --- a/packages/shorebird_cli/lib/src/commands/build/build_aar_command.dart +++ b/packages/shorebird_cli/lib/src/commands/build/build_aar_command.dart @@ -5,6 +5,7 @@ import 'package:path/path.dart' as p; import 'package:shorebird_cli/src/artifact_builder.dart'; import 'package:shorebird_cli/src/command.dart'; import 'package:shorebird_cli/src/logger.dart'; +import 'package:shorebird_cli/src/release_type.dart'; import 'package:shorebird_cli/src/shorebird_env.dart'; import 'package:shorebird_cli/src/shorebird_validator.dart'; @@ -55,7 +56,7 @@ class BuildAarCommand extends ShorebirdCommand { try { await artifactBuilder.buildAar( buildNumber: buildNumber, - argResultsRest: results.rest, + args: results.forwardedArgs, ); } on ArtifactBuildException catch (error) { buildProgress.fail('Failed to build: ${error.message}'); diff --git a/packages/shorebird_cli/lib/src/commands/build/build_apk_command.dart b/packages/shorebird_cli/lib/src/commands/build/build_apk_command.dart index ac002a01..891d8b9e 100644 --- a/packages/shorebird_cli/lib/src/commands/build/build_apk_command.dart +++ b/packages/shorebird_cli/lib/src/commands/build/build_apk_command.dart @@ -4,6 +4,7 @@ import 'package:shorebird_cli/src/artifact_builder.dart'; import 'package:shorebird_cli/src/command.dart'; import 'package:shorebird_cli/src/doctor.dart'; import 'package:shorebird_cli/src/logger.dart'; +import 'package:shorebird_cli/src/release_type.dart'; import 'package:shorebird_cli/src/shorebird_validator.dart'; /// {@template build_apk_command} @@ -51,7 +52,7 @@ class BuildApkCommand extends ShorebirdCommand { await artifactBuilder.buildApk( flavor: flavor, target: target, - argResultsRest: results.rest, + args: results.forwardedArgs, ); } on ArtifactBuildException catch (error) { buildProgress.fail(error.message); diff --git a/packages/shorebird_cli/lib/src/commands/build/build_app_bundle_command.dart b/packages/shorebird_cli/lib/src/commands/build/build_app_bundle_command.dart index 2f5bae2b..c7219255 100644 --- a/packages/shorebird_cli/lib/src/commands/build/build_app_bundle_command.dart +++ b/packages/shorebird_cli/lib/src/commands/build/build_app_bundle_command.dart @@ -4,6 +4,7 @@ import 'package:shorebird_cli/src/artifact_builder.dart'; import 'package:shorebird_cli/src/command.dart'; import 'package:shorebird_cli/src/doctor.dart'; import 'package:shorebird_cli/src/logger.dart'; +import 'package:shorebird_cli/src/release_type.dart'; import 'package:shorebird_cli/src/shorebird_validator.dart'; /// {@template build_app_bundle_command} @@ -51,7 +52,7 @@ class BuildAppBundleCommand extends ShorebirdCommand { await artifactBuilder.buildAppBundle( flavor: flavor, target: target, - argResultsRest: results.rest, + args: results.forwardedArgs, ); } on ArtifactBuildException catch (error) { buildProgress.fail(error.message); diff --git a/packages/shorebird_cli/lib/src/commands/build/build_ipa_command.dart b/packages/shorebird_cli/lib/src/commands/build/build_ipa_command.dart index 9f5cbd9a..9b1fde5c 100644 --- a/packages/shorebird_cli/lib/src/commands/build/build_ipa_command.dart +++ b/packages/shorebird_cli/lib/src/commands/build/build_ipa_command.dart @@ -4,6 +4,7 @@ import 'package:shorebird_cli/src/artifact_builder.dart'; import 'package:shorebird_cli/src/command.dart'; import 'package:shorebird_cli/src/doctor.dart'; import 'package:shorebird_cli/src/logger.dart'; +import 'package:shorebird_cli/src/release_type.dart'; import 'package:shorebird_cli/src/shorebird_validator.dart'; /// {@template build_ipa_command} @@ -65,7 +66,7 @@ Codesigning is disabled. You must manually codesign before deploying to devices. flavor: flavor, target: target, codesign: codesign, - argResultsRest: results.rest, + args: results.forwardedArgs, ); } on ArtifactBuildException catch (error) { buildProgress.fail('Failed to build: ${error.message}'); diff --git a/packages/shorebird_cli/lib/src/commands/patch/aar_patcher.dart b/packages/shorebird_cli/lib/src/commands/patch/aar_patcher.dart index 8284766c..9a4dfbfe 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/aar_patcher.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/aar_patcher.dart @@ -72,7 +72,7 @@ class AarPatcher extends Patcher { try { await artifactBuilder.buildAar( buildNumber: buildNumber, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); buildProgress.complete(); } on ArtifactBuildException catch (error) { diff --git a/packages/shorebird_cli/lib/src/commands/patch/android_patcher.dart b/packages/shorebird_cli/lib/src/commands/patch/android_patcher.dart index e044c620..d77c1d5e 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/android_patcher.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/android_patcher.dart @@ -64,7 +64,7 @@ class AndroidPatcher extends Patcher { aabFile = await artifactBuilder.buildAppBundle( flavor: flavor, target: target, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); buildProgress.complete(); } on ArtifactBuildException catch (error) { diff --git a/packages/shorebird_cli/lib/src/commands/patch/ios_framework_patcher.dart b/packages/shorebird_cli/lib/src/commands/patch/ios_framework_patcher.dart index a9a6f72f..71fa1a48 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/ios_framework_patcher.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/ios_framework_patcher.dart @@ -84,7 +84,7 @@ class IosFrameworkPatcher extends Patcher { ); try { await artifactBuilder.buildIosFramework( - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); } on ArtifactBuildException catch (error) { buildProgress.fail(error.message); diff --git a/packages/shorebird_cli/lib/src/commands/patch/ios_patcher.dart b/packages/shorebird_cli/lib/src/commands/patch/ios_patcher.dart index dc6219bf..2d4b2d02 100644 --- a/packages/shorebird_cli/lib/src/commands/patch/ios_patcher.dart +++ b/packages/shorebird_cli/lib/src/commands/patch/ios_patcher.dart @@ -96,7 +96,7 @@ class IosPatcher extends Patcher { exportOptionsPlist: exportOptionsPlist, flavor: flavor, target: target, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); } on ProcessException catch (error) { buildProgress.fail('Failed to build: ${error.message}'); diff --git a/packages/shorebird_cli/lib/src/commands/release/aar_releaser.dart b/packages/shorebird_cli/lib/src/commands/release/aar_releaser.dart index 60da9217..3e53bea3 100644 --- a/packages/shorebird_cli/lib/src/commands/release/aar_releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/aar_releaser.dart @@ -80,7 +80,7 @@ class AarReleaser extends Releaser { await artifactBuilder.buildAar( buildNumber: buildNumber, targetPlatforms: architectures, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); } catch (e) { logger.err('Failed to build aar: $e'); diff --git a/packages/shorebird_cli/lib/src/commands/release/android_releaser.dart b/packages/shorebird_cli/lib/src/commands/release/android_releaser.dart index 116c8982..ef194c89 100644 --- a/packages/shorebird_cli/lib/src/commands/release/android_releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/android_releaser.dart @@ -95,7 +95,7 @@ Please comment and upvote ${link(uri: Uri.parse('https://github.com/shorebirdtec flavor: flavor, target: target, targetPlatforms: architectures, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); } on ArtifactBuildException catch (e) { buildAppBundleProgress.fail(e.message); @@ -112,7 +112,7 @@ Please comment and upvote ${link(uri: Uri.parse('https://github.com/shorebirdtec flavor: flavor, target: target, targetPlatforms: architectures, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); } on ArtifactBuildException catch (e) { buildApkProgress.fail(e.message); diff --git a/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart b/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart index 8608ed12..7e1c6fbc 100644 --- a/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/ios_framework_releaser.dart @@ -70,9 +70,7 @@ class IosFrameworkReleaser extends Releaser { ); try { - await artifactBuilder.buildIosFramework( - argResultsRest: argResults.rest, - ); + await artifactBuilder.buildIosFramework(args: argResults.forwardedArgs); } catch (error) { buildProgress.fail('Failed to build iOS framework: $error'); exit(ExitCode.software.code); diff --git a/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart b/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart index 9bb7b3fd..2d4c77ef 100644 --- a/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart +++ b/packages/shorebird_cli/lib/src/commands/release/ios_releaser.dart @@ -104,7 +104,7 @@ class IosReleaser extends Releaser { exportOptionsPlist: exportOptionsPlist, flavor: flavor, target: target, - argResultsRest: argResults.rest, + args: argResults.forwardedArgs, ); buildProgress.complete(); } on ArtifactBuildException catch (error) { diff --git a/packages/shorebird_cli/lib/src/release_type.dart b/packages/shorebird_cli/lib/src/release_type.dart index b25d0330..9cabf97c 100644 --- a/packages/shorebird_cli/lib/src/release_type.dart +++ b/packages/shorebird_cli/lib/src/release_type.dart @@ -45,6 +45,9 @@ enum ReleaseType { } } +bool _isPlatform(String platform) => + ReleaseType.values.any((target) => target.cliName == platform); + extension ReleaseTypeArgs on ArgResults { Iterable get releaseTypes { final List releaseTypeCliNames; @@ -64,4 +67,10 @@ extension ReleaseTypeArgs on ArgResults { ReleaseType.values.firstWhere((target) => target.cliName == cliName), ); } + + List get forwardedArgs { + if (rest.isEmpty) return []; + if (_isPlatform(rest.first)) return rest.skip(1).toList(); + return rest; + } } diff --git a/packages/shorebird_cli/pubspec.lock b/packages/shorebird_cli/pubspec.lock index 412b1bff..45e2a712 100644 --- a/packages/shorebird_cli/pubspec.lock +++ b/packages/shorebird_cli/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: asn1lib - sha256: c9c85fedbe2188b95133cbe960e16f5f448860f7133330e272edbbca5893ddc6 + sha256: "58082b3f0dca697204dbab0ef9ff208bfaea7767ea771076af9a343488428dda" url: "https://pub.dev" source: hosted - version: "1.5.2" + version: "1.5.3" async: dependency: transitive description: diff --git a/packages/shorebird_cli/test/src/artifact_builder_test.dart b/packages/shorebird_cli/test/src/artifact_builder_test.dart index 8c5d14c1..b236b261 100644 --- a/packages/shorebird_cli/test/src/artifact_builder_test.dart +++ b/packages/shorebird_cli/test/src/artifact_builder_test.dart @@ -179,7 +179,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa flavor: 'flavor', target: 'target', targetPlatforms: [Arch.arm64], - argResultsRest: ['--foo', 'bar'], + args: ['--foo', 'bar'], ), ); @@ -316,7 +316,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa flavor: 'flavor', target: 'target', targetPlatforms: [Arch.arm64], - argResultsRest: ['--foo', 'bar'], + args: ['--foo', 'bar'], ), ); @@ -453,7 +453,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa () => builder.buildAar( buildNumber: buildNumber, targetPlatforms: [Arch.arm64], - argResultsRest: ['--foo', 'bar'], + args: ['--foo', 'bar'], ), ); @@ -593,7 +593,7 @@ Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.pa exportOptionsPlist: File('exportOptionsPlist.plist'), flavor: 'flavor', target: 'target.dart', - argResultsRest: ['--foo', 'bar'], + args: ['--foo', 'bar'], ), ); @@ -729,9 +729,7 @@ Failed to build: test('forward arguments to flutter build', () async { await runWithOverrides( - () => builder.buildIosFramework( - argResultsRest: ['--foo', 'bar'], - ), + () => builder.buildIosFramework(args: ['--foo', 'bar']), ); verify( diff --git a/packages/shorebird_cli/test/src/commands/build/build_aar_command_test.dart b/packages/shorebird_cli/test/src/commands/build/build_aar_command_test.dart index 2165069f..fe8b21e8 100644 --- a/packages/shorebird_cli/test/src/commands/build/build_aar_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/build/build_aar_command_test.dart @@ -51,7 +51,7 @@ void main() { when( () => artifactBuilder.buildAar( buildNumber: any(named: 'buildNumber'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => {}); when( @@ -102,7 +102,7 @@ void main() { when( () => artifactBuilder.buildAar( buildNumber: any(named: 'buildNumber'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(ArtifactBuildException('Failed to build: error')); @@ -110,26 +110,59 @@ void main() { expect(result, equals(ExitCode.software.code)); verify( - () => artifactBuilder.buildAar( - buildNumber: buildNumber, - argResultsRest: [], - ), + () => artifactBuilder.buildAar(buildNumber: buildNumber, args: []), ).called(1); verify( () => progress.fail(any(that: contains('Failed to build'))), ).called(1); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('exits with code 0 when building aar succeeds', () async { + final result = await runWithOverrides(command.run); + + expect(result, equals(ExitCode.success.code)); + + verify( + () => artifactBuilder.buildAar( + buildNumber: buildNumber, + args: ['--verbose'], + ), + ).called(1); + verify( + () => logger.info( + ''' +📦 Generated an aar at: +${lightCyan.wrap( + p.join( + 'build', + 'host', + 'outputs', + 'repo', + 'com', + 'example', + 'my_flutter_module', + 'flutter_release', + buildNumber, + 'flutter_release-$buildNumber.aar', + ), + )}''', + ), + ).called(1); + }); + }); + test('exits with code 0 when building aar succeeds', () async { final result = await runWithOverrides(command.run); expect(result, equals(ExitCode.success.code)); verify( - () => artifactBuilder.buildAar( - buildNumber: buildNumber, - argResultsRest: [], - ), + () => artifactBuilder.buildAar(buildNumber: buildNumber, args: []), ).called(1); verify( () => logger.info( diff --git a/packages/shorebird_cli/test/src/commands/build/build_apk_command_test.dart b/packages/shorebird_cli/test/src/commands/build/build_apk_command_test.dart index a0c6d5e3..c2755eba 100644 --- a/packages/shorebird_cli/test/src/commands/build/build_apk_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/build/build_apk_command_test.dart @@ -69,7 +69,7 @@ void main() { () => artifactBuilder.buildApk( flavor: any(named: 'flavor'), target: any(named: 'target'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => File('')); @@ -108,7 +108,7 @@ void main() { () => artifactBuilder.buildApk( flavor: any(named: 'flavor'), target: any(named: 'target'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(ArtifactBuildException('oops')); @@ -116,21 +116,40 @@ void main() { expect(exitCode, equals(ExitCode.software.code)); verify( - () => artifactBuilder.buildApk( - argResultsRest: [], - ), + () => artifactBuilder.buildApk(args: []), ).called(1); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('exits with code 0 when building apk succeeds', () async { + final exitCode = await runWithOverrides(command.run); + + expect(exitCode, equals(ExitCode.success.code)); + + verify( + () => artifactBuilder.buildApk(args: ['--verbose']), + ).called(1); + verify( + () => logger.info( + ''' +📦 Generated an apk at: +${lightCyan.wrap(p.join('build', 'app', 'outputs', 'apk', 'release', 'app-release.apk'))}''', + ), + ).called(1); + }); + }); + test('exits with code 0 when building apk succeeds', () async { final exitCode = await runWithOverrides(command.run); expect(exitCode, equals(ExitCode.success.code)); verify( - () => artifactBuilder.buildApk( - argResultsRest: [], - ), + () => artifactBuilder.buildApk(args: []), ).called(1); verify( () => logger.info( @@ -156,7 +175,7 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'apk', 'release', 'app-releas () => artifactBuilder.buildApk( flavor: flavor, target: target, - argResultsRest: [], + args: [], ), ).called(1); verify( diff --git a/packages/shorebird_cli/test/src/commands/build/build_app_bundle_command_test.dart b/packages/shorebird_cli/test/src/commands/build/build_app_bundle_command_test.dart index 15a6ee39..1bba587a 100644 --- a/packages/shorebird_cli/test/src/commands/build/build_app_bundle_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/build/build_app_bundle_command_test.dart @@ -71,11 +71,9 @@ void main() { () => artifactBuilder.buildAppBundle( flavor: any(named: 'flavor'), target: any(named: 'target'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), - ).thenAnswer( - (_) async => File(''), - ); + ).thenAnswer((_) async => File('')); command = runWithOverrides(BuildAppBundleCommand.new) ..testArgResults = argResults; @@ -110,7 +108,7 @@ void main() { test('exits with code 70 when building appbundle fails', () async { when( () => artifactBuilder.buildAppBundle( - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow( ArtifactBuildException('Failed to build: oops'), @@ -120,19 +118,42 @@ void main() { expect(exitCode, equals(ExitCode.software.code)); verify( - () => artifactBuilder.buildAppBundle( - argResultsRest: [], - ), + () => artifactBuilder.buildAppBundle(args: []), ).called(1); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('exits with code 0 when building appbundle succeeds', () async { + final exitCode = await runWithOverrides(command.run); + + expect(exitCode, equals(ExitCode.success.code)); + verify( + () => artifactBuilder.buildAppBundle( + args: ['--verbose'], + ), + ).called(1); + + verify( + () => logger.info( + ''' +📦 Generated an app bundle at: +${lightCyan.wrap(p.join('build', 'app', 'outputs', 'bundle', 'release', 'app-release.aab'))}''', + ), + ).called(1); + }); + }); + test('exits with code 0 when building appbundle succeeds', () async { final exitCode = await runWithOverrides(command.run); expect(exitCode, equals(ExitCode.success.code)); verify( () => artifactBuilder.buildAppBundle( - argResultsRest: [], + args: [], ), ).called(1); @@ -159,7 +180,7 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'bundle', 'release', 'app-rel () => artifactBuilder.buildAppBundle( flavor: flavor, target: target, - argResultsRest: [], + args: [], ), ).called(1); diff --git a/packages/shorebird_cli/test/src/commands/build/build_ipa_command_test.dart b/packages/shorebird_cli/test/src/commands/build/build_ipa_command_test.dart index 95ea68b6..fc87ab2b 100644 --- a/packages/shorebird_cli/test/src/commands/build/build_ipa_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/build/build_ipa_command_test.dart @@ -69,7 +69,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), codesign: any(named: 'codesign'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => File('')); when(() => ios.createExportOptionsPlist()).thenReturn(File('.')); @@ -123,7 +123,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), codesign: any(named: 'codesign'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(ArtifactBuildException('oops')); @@ -132,17 +132,46 @@ void main() { expect(exitCode, equals(ExitCode.software.code)); verify( () => artifactBuilder.buildIpa( - argResultsRest: [], + args: [], ), ).called(1); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['ios', '--verbose']); + }); + + test('exits with code 0 when building ipa succeeds', () async { + final exitCode = await runWithOverrides(command.run); + + expect(exitCode, equals(ExitCode.success.code)); + + verify( + () => artifactBuilder.buildIpa(args: ['--verbose']), + ).called(1); + + verifyInOrder([ + () => logger.info( + ''' +📦 Generated an xcode archive at: +${lightCyan.wrap(p.join('build', 'ios', 'archive', 'Runner.xcarchive'))}''', + ), + () => logger.info( + ''' +📦 Generated an ipa at: +${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''', + ), + ]); + }); + }); + test('exits with code 0 when building ipa succeeds', () async { final exitCode = await runWithOverrides(command.run); expect(exitCode, equals(ExitCode.success.code)); - verify(() => artifactBuilder.buildIpa(argResultsRest: [])).called(1); + verify(() => artifactBuilder.buildIpa(args: [])).called(1); verifyInOrder([ () => logger.info( @@ -173,7 +202,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''', () => artifactBuilder.buildIpa( flavor: flavor, target: target, - argResultsRest: [], + args: [], ), ).called(1); @@ -200,7 +229,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''', expect(exitCode, equals(ExitCode.success.code)); verify( - () => artifactBuilder.buildIpa(codesign: false, argResultsRest: []), + () => artifactBuilder.buildIpa(codesign: false, args: []), ).called(1); verify( diff --git a/packages/shorebird_cli/test/src/commands/patch/aar_patcher_test.dart b/packages/shorebird_cli/test/src/commands/patch/aar_patcher_test.dart index c7b5d7a8..8a8cc3be 100644 --- a/packages/shorebird_cli/test/src/commands/patch/aar_patcher_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/aar_patcher_test.dart @@ -236,7 +236,7 @@ void main() { when( () => artifactBuilder.buildAar( buildNumber: any(named: 'buildNumber'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(exception); }); @@ -256,11 +256,47 @@ void main() { when( () => artifactBuilder.buildAar( buildNumber: any(named: 'buildNumber'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => {}); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('returns the aar artifact file', () async { + final artifact = await runWithOverrides(patcher.buildPatchArtifact); + + expect(artifact, isA()); + expect( + artifact.path, + endsWith( + p.join( + 'build', + 'host', + 'outputs', + 'repo', + 'com', + 'example', + 'my_flutter_module', + 'flutter_release', + buildNumber, + 'flutter_release-$buildNumber.aar', + ), + ), + ); + + verify( + () => artifactBuilder.buildAar( + buildNumber: buildNumber, + args: ['--verbose'], + ), + ).called(1); + }); + }); + test('returns the aar artifact file', () async { final artifact = await runWithOverrides(patcher.buildPatchArtifact); @@ -286,7 +322,7 @@ void main() { verify( () => artifactBuilder.buildAar( buildNumber: buildNumber, - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).called(1); }); diff --git a/packages/shorebird_cli/test/src/commands/patch/android_patcher_test.dart b/packages/shorebird_cli/test/src/commands/patch/android_patcher_test.dart index 9cba963a..053bfef2 100644 --- a/packages/shorebird_cli/test/src/commands/patch/android_patcher_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/android_patcher_test.dart @@ -228,7 +228,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => aabFile); }); @@ -241,7 +241,7 @@ void main() { () => artifactBuilder.buildAppBundle( flavor: any(named: 'flavor'), target: any(named: 'target'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(exception); when(() => logger.progress(any())).thenReturn(progress); @@ -286,6 +286,22 @@ Looked in: group('when build succeeds', () { setUp(setUpProjectRootArtifacts); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('returns the aab file', () async { + final result = await runWithOverrides(patcher.buildPatchArtifact); + expect(result, equals(aabFile)); + verify( + () => artifactBuilder.buildAppBundle( + args: ['--verbose'], + ), + ).called(1); + }); + }); + test('returns the aab file', () async { final result = await runWithOverrides(patcher.buildPatchArtifact); expect(result, equals(aabFile)); diff --git a/packages/shorebird_cli/test/src/commands/patch/ios_framework_patcher_test.dart b/packages/shorebird_cli/test/src/commands/patch/ios_framework_patcher_test.dart index 5545e544..f0af317e 100644 --- a/packages/shorebird_cli/test/src/commands/patch/ios_framework_patcher_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/ios_framework_patcher_test.dart @@ -287,9 +287,7 @@ void main() { group('when build fails', () { setUp(() { when( - () => artifactBuilder.buildIosFramework( - argResultsRest: any(named: 'argResultsRest'), - ), + () => artifactBuilder.buildIosFramework(args: any(named: 'args')), ).thenThrow( ArtifactBuildException('Build failed'), ); @@ -308,9 +306,7 @@ void main() { group('when elf aot snapshot build fails', () { setUp(() { when( - () => artifactBuilder.buildIosFramework( - argResultsRest: any(named: 'argResultsRest'), - ), + () => artifactBuilder.buildIosFramework(args: any(named: 'args')), ).thenAnswer( (_) async {}, ); @@ -338,9 +334,7 @@ void main() { group('when build succeeds', () { setUp(() { when( - () => artifactBuilder.buildIosFramework( - argResultsRest: any(named: 'argResultsRest'), - ), + () => artifactBuilder.buildIosFramework(args: any(named: 'args')), ).thenAnswer( (_) async {}, ); @@ -363,6 +357,24 @@ void main() { .thenReturn(projectRoot); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['ios', '--verbose']); + }); + + test('returns zipped xcframework', () async { + final artifact = await runWithOverrides( + patcher.buildPatchArtifact, + ); + expect(p.basename(artifact.path), equals('App.xcframework.zip')); + verify( + () => artifactBuilder.buildIosFramework( + args: ['--verbose'], + ), + ).called(1); + }); + }); + test('returns zipped xcframework', () async { final artifact = await runWithOverrides(patcher.buildPatchArtifact); expect(p.basename(artifact.path), equals('App.xcframework.zip')); diff --git a/packages/shorebird_cli/test/src/commands/patch/ios_patcher_test.dart b/packages/shorebird_cli/test/src/commands/patch/ios_patcher_test.dart index d72e0e2d..73955d22 100644 --- a/packages/shorebird_cli/test/src/commands/patch/ios_patcher_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/ios_patcher_test.dart @@ -289,7 +289,7 @@ void main() { () => artifactBuilder.buildIpa( exportOptionsPlist: any(named: 'exportOptionsPlist'), codesign: any(named: 'codesign'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), flavor: any(named: 'flavor'), target: any(named: 'target'), ), @@ -318,7 +318,7 @@ void main() { () => artifactBuilder.buildIpa( exportOptionsPlist: any(named: 'exportOptionsPlist'), codesign: any(named: 'codesign'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), flavor: any(named: 'flavor'), target: any(named: 'target'), ), @@ -343,7 +343,7 @@ void main() { () => artifactBuilder.buildIpa( exportOptionsPlist: any(named: 'exportOptionsPlist'), codesign: any(named: 'codesign'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), flavor: any(named: 'flavor'), target: any(named: 'target'), ), @@ -375,7 +375,7 @@ void main() { () => artifactBuilder.buildIpa( exportOptionsPlist: any(named: 'exportOptionsPlist'), codesign: any(named: 'codesign'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), flavor: any(named: 'flavor'), target: any(named: 'target'), ), @@ -405,6 +405,26 @@ void main() { ); }); + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['ios', '--verbose']); + }); + + test('returns xcarchive zip', () async { + final artifact = await runWithOverrides( + patcher.buildPatchArtifact, + ); + expect(p.basename(artifact.path), endsWith('.zip')); + verify( + () => artifactBuilder.buildIpa( + exportOptionsPlist: any(named: 'exportOptionsPlist'), + codesign: any(named: 'codesign'), + args: ['--verbose'], + ), + ).called(1); + }); + }); + test('returns xcarchive zip', () async { final artifact = await runWithOverrides(patcher.buildPatchArtifact); expect(p.basename(artifact.path), endsWith('.zip')); diff --git a/packages/shorebird_cli/test/src/commands/release/aar_releaser_test.dart b/packages/shorebird_cli/test/src/commands/release/aar_releaser_test.dart index 80fdda1e..239071b2 100644 --- a/packages/shorebird_cli/test/src/commands/release/aar_releaser_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/aar_releaser_test.dart @@ -261,7 +261,7 @@ void main() { () => artifactBuilder.buildAar( buildNumber: any(named: 'buildNumber'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer( (_) async => File(''), @@ -274,6 +274,27 @@ void main() { }); group('when build succeeds', () { + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('produces aar in release directory', () async { + final aar = await runWithOverrides( + () => aarReleaser.buildReleaseArtifacts(), + ); + + expect(aar.path, p.join(projectRoot.path, 'release')); + verify( + () => artifactBuilder.buildAar( + buildNumber: buildNumber, + targetPlatforms: Arch.values.toSet(), + args: ['--verbose'], + ), + ).called(1); + }); + }); + test('produces aar in release directory', () async { final aar = await runWithOverrides( () => aarReleaser.buildReleaseArtifacts(), @@ -284,7 +305,7 @@ void main() { () => artifactBuilder.buildAar( buildNumber: buildNumber, targetPlatforms: Arch.values.toSet(), - argResultsRest: [], + args: [], ), ).called(1); }); @@ -296,7 +317,7 @@ void main() { () => artifactBuilder.buildAar( buildNumber: any(named: 'buildNumber'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(Exception('build failed')); }); diff --git a/packages/shorebird_cli/test/src/commands/release/android_releaser_test.dart b/packages/shorebird_cli/test/src/commands/release/android_releaser_test.dart index 4f01f225..545927c9 100644 --- a/packages/shorebird_cli/test/src/commands/release/android_releaser_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/android_releaser_test.dart @@ -225,7 +225,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => aabFile); when( @@ -233,7 +233,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer( (_) async => File(''), @@ -256,7 +256,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(ArtifactBuildException('Uh oh')); }); @@ -282,7 +282,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(ArtifactBuildException('Uh oh')); }); @@ -298,6 +298,25 @@ void main() { }); group('when the build succeeds', () { + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['android', '--verbose']); + }); + + test('returns the path to the aab', () async { + final result = await runWithOverrides( + () => androidReleaser.buildReleaseArtifacts(), + ); + expect(result, aabFile); + verify( + () => artifactBuilder.buildAppBundle( + targetPlatforms: Arch.values, + args: ['--verbose'], + ), + ).called(1); + }); + }); + test('returns the path to the aab', () async { final result = await runWithOverrides( () => androidReleaser.buildReleaseArtifacts(), @@ -306,7 +325,7 @@ void main() { verify( () => artifactBuilder.buildAppBundle( targetPlatforms: Arch.values, - argResultsRest: [], + args: [], ), ).called(1); }); @@ -320,7 +339,7 @@ void main() { flavor: any(named: 'flavor'), target: any(named: 'target'), targetPlatforms: any(named: 'targetPlatforms'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ); }); @@ -346,7 +365,7 @@ void main() { flavor: flavor, target: target, targetPlatforms: Arch.values, - argResultsRest: [], + args: [], ), ).called(1); verify( @@ -354,7 +373,7 @@ void main() { flavor: flavor, target: target, targetPlatforms: Arch.values, - argResultsRest: [], + args: [], ), ).called(1); }); diff --git a/packages/shorebird_cli/test/src/commands/release/ios_framework_releaser_test.dart b/packages/shorebird_cli/test/src/commands/release/ios_framework_releaser_test.dart index 69729838..3a03ac6c 100644 --- a/packages/shorebird_cli/test/src/commands/release/ios_framework_releaser_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/ios_framework_releaser_test.dart @@ -246,9 +246,7 @@ void main() { setUp(() { when( - () => artifactBuilder.buildIosFramework( - argResultsRest: any(named: 'argResultsRest'), - ), + () => artifactBuilder.buildIosFramework(args: any(named: 'args')), ).thenAnswer( (_) async => File(''), ); @@ -271,6 +269,23 @@ void main() { }); group('when build succeeds', () { + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['ios', '--verbose']); + }); + + test('produces xcframework in release directory', () async { + final xcframework = await runWithOverrides( + iosFrameworkReleaser.buildReleaseArtifacts, + ); + + expect(xcframework.path, p.join(projectRoot.path, 'release')); + verify( + () => artifactBuilder.buildIosFramework(args: ['--verbose']), + ).called(1); + }); + }); + test('produces xcframework in release directory', () async { final xcframework = await runWithOverrides( iosFrameworkReleaser.buildReleaseArtifacts, @@ -278,7 +293,7 @@ void main() { expect(xcframework.path, p.join(projectRoot.path, 'release')); verify( - () => artifactBuilder.buildIosFramework(argResultsRest: []), + () => artifactBuilder.buildIosFramework(args: []), ).called(1); }); }); @@ -286,9 +301,7 @@ void main() { group('when build fails', () { setUp(() { when( - () => artifactBuilder.buildIosFramework( - argResultsRest: any(named: 'argResultsRest'), - ), + () => artifactBuilder.buildIosFramework(args: any(named: 'args')), ).thenThrow(Exception('build failed')); }); diff --git a/packages/shorebird_cli/test/src/commands/release/ios_releaser_test.dart b/packages/shorebird_cli/test/src/commands/release/ios_releaser_test.dart index 9ddc02df..b98a0636 100644 --- a/packages/shorebird_cli/test/src/commands/release/ios_releaser_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/ios_releaser_test.dart @@ -261,7 +261,7 @@ void main() { exportOptionsPlist: any(named: 'exportOptionsPlist'), flavor: any(named: 'flavor'), target: any(named: 'target'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenAnswer((_) async => {}); @@ -331,7 +331,7 @@ void main() { exportOptionsPlist: any(named: 'exportOptionsPlist'), flavor: any(named: 'flavor'), target: any(named: 'target'), - argResultsRest: any(named: 'argResultsRest'), + args: any(named: 'args'), ), ).thenThrow(ArtifactBuildException('Failed to build')); }); @@ -349,6 +349,35 @@ void main() { }); group('when build succeeds', () { + group('when build succeeds', () { + group('when platform was specified via arg results rest', () { + setUp(() { + when(() => argResults.rest).thenReturn(['ios', '--verbose']); + }); + + test('verifies artifacts exist and returns xcarchive path', + () async { + expect( + await runWithOverrides(iosReleaser.buildReleaseArtifacts), + equals(xcarchiveDirectory), + ); + + verify(() => artifactManager.getXcarchiveDirectory()).called(1); + verify( + () => artifactManager.getIosAppDirectory( + xcarchiveDirectory: xcarchiveDirectory, + ), + ).called(1); + verify( + () => artifactBuilder.buildIpa( + exportOptionsPlist: any(named: 'exportOptionsPlist'), + args: ['--verbose'], + ), + ).called(1); + }); + }); + }); + test('verifies artifacts exist and returns xcarchive path', () async { expect( await runWithOverrides(iosReleaser.buildReleaseArtifacts),