fix(shorebird_cli): run flutter pub get after builds to reset .dart_tool/package_config.json (#1111)

This commit is contained in:
Bryan Oltman
2023-08-17 13:29:16 -04:00
committed by GitHub
parent 3460fa5ca7
commit c8b5676be8
13 changed files with 458 additions and 30 deletions
@@ -5,6 +5,7 @@ import 'package:mason_logger/mason_logger.dart';
import 'package:path/path.dart' as p;
import 'package:shorebird_cli/src/cache.dart';
import 'package:shorebird_cli/src/command.dart';
import 'package:shorebird_cli/src/logger.dart';
import 'package:shorebird_cli/src/process.dart';
import 'package:shorebird_cli/src/shorebird_env.dart';
@@ -106,6 +107,8 @@ mixin ShorebirdBuildMixin on ShorebirdCommand {
result.exitCode,
);
}
await _systemFlutterPubGet();
}
Future<void> buildAar({required String buildNumber}) async {
@@ -133,6 +136,8 @@ mixin ShorebirdBuildMixin on ShorebirdCommand {
result.exitCode,
);
}
await _systemFlutterPubGet();
}
Future<void> buildApk({
@@ -165,6 +170,8 @@ mixin ShorebirdBuildMixin on ShorebirdCommand {
result.exitCode,
);
}
await _systemFlutterPubGet();
}
Future<void> buildIpa({
@@ -198,7 +205,11 @@ mixin ShorebirdBuildMixin on ShorebirdCommand {
result.stderr.toString(),
result.exitCode,
);
} else if (result.stderr
}
await _systemFlutterPubGet();
if (result.stderr
.toString()
.contains('Encountered error while creating the IPA')) {
final errorMessage = _failedToCreateIpaErrorMessage(
@@ -234,6 +245,35 @@ mixin ShorebirdBuildMixin on ShorebirdCommand {
result.exitCode,
);
}
await _systemFlutterPubGet();
}
/// This is a hack to reset `.dart_tool/package_config.json` to point to the
/// Flutter SDK on the user's PATH. This is necessary because Flutter commands
/// run by shorebird update the package_config.json file to point to
/// shorebird's version of Flutter, which confuses VS Code. See
/// https://github.com/shorebirdtech/shorebird/issues/1101 for more info.
Future<void> _systemFlutterPubGet() async {
const executable = 'flutter';
final arguments = ['pub', 'get', '--offline'];
final result = await process.run(
executable,
arguments,
runInShell: true,
useVendedFlutter: false,
);
if (result.exitCode != ExitCode.success.code) {
logger.warn(
'''
Build was successful, but `flutter pub get` failed to run after the build completed. You may see unexpected behavior in VS Code.
Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.parse('https://docs.shorebird.dev/troubleshooting#i-installed-shorebird-and-now-i-cant-run-my-app-in-vs-code'))}.
''',
);
}
}
/// Creates an ExportOptions.plist file, which is used to tell xcodebuild to
@@ -34,7 +34,8 @@ void main() {
late Progress progress;
late ShorebirdEnv shorebirdEnv;
late ShorebirdProcess shorebirdProcess;
late ShorebirdProcessResult processResult;
late ShorebirdProcessResult buildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdValidator shorebirdValidator;
late BuildAarCommand command;
@@ -53,7 +54,8 @@ void main() {
setUp(() {
argResults = _MockArgResults();
logger = _MockLogger();
processResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
buildProcessResult = _MockProcessResult();
progress = _MockProgress();
shorebirdEnv = _MockShorebirdEnv();
shorebirdProcess = _MockShorebirdProcess();
@@ -63,6 +65,16 @@ void main() {
when(() => argResults.rest).thenReturn([]);
when(() => logger.progress(any())).thenReturn(progress);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => shorebirdProcess.run(
any(),
@@ -70,7 +82,7 @@ void main() {
runInShell: any(named: 'runInShell'),
),
).thenAnswer((invocation) async {
return processResult;
return buildProcessResult;
});
when(
@@ -119,8 +131,8 @@ void main() {
});
test('exits with code 70 when building aar fails', () async {
when(() => processResult.exitCode).thenReturn(1);
when(() => processResult.stderr).thenReturn('oops');
when(() => buildProcessResult.exitCode).thenReturn(1);
when(() => buildProcessResult.stderr).thenReturn('oops');
final result = await runWithOverrides(command.run);
@@ -144,7 +156,7 @@ void main() {
});
test('exits with code 0 when building aar succeeds', () async {
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final result = await runWithOverrides(command.run);
expect(result, equals(ExitCode.success.code));
@@ -183,5 +195,20 @@ ${lightCyan.wrap(
),
).called(1);
});
test('runs flutter pub get with system flutter after successful build',
() async {
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
await runWithOverrides(command.run);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
});
}
@@ -37,7 +37,8 @@ void main() {
late ArgResults argResults;
late Doctor doctor;
late Logger logger;
late ShorebirdProcessResult processResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdProcessResult buildProcessResult;
late BuildApkCommand command;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
@@ -64,17 +65,28 @@ void main() {
doctor = _MockDoctor();
logger = _MockLogger();
shorebirdProcess = _MockShorebirdProcess();
processResult = _MockProcessResult();
buildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdValidator = _MockShorebirdValidator();
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => shorebirdProcess.run(
any(),
any(),
runInShell: any(named: 'runInShell'),
),
).thenAnswer((_) async => processResult);
).thenAnswer((_) async => buildProcessResult);
when(() => argResults.rest).thenReturn([]);
when(() => logger.progress(any())).thenReturn(_MockProgress());
when(() => logger.info(any())).thenReturn(null);
@@ -120,8 +132,8 @@ void main() {
});
test('exits with code 70 when building apk fails', () async {
when(() => processResult.exitCode).thenReturn(1);
when(() => processResult.stderr).thenReturn('oops');
when(() => buildProcessResult.exitCode).thenReturn(1);
when(() => buildProcessResult.stderr).thenReturn('oops');
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
@@ -140,7 +152,7 @@ void main() {
});
test('exits with code 0 when building apk succeeds', () async {
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -165,6 +177,26 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'apk', 'release', 'app-releas
).called(1);
});
test('runs flutter pub get with system flutter after successful build',
() async {
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test(
'exits with code 0 when building apk succeeds '
'with flavor and target', () async {
@@ -172,7 +204,7 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'apk', 'release', 'app-releas
final target = p.join('lib', 'main_development.dart');
when(() => argResults['flavor']).thenReturn(flavor);
when(() => argResults['target']).thenReturn(target);
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -37,7 +37,8 @@ void main() {
late ArgResults argResults;
late Doctor doctor;
late Logger logger;
late ShorebirdProcessResult processResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdProcessResult buildProcessResult;
late BuildAppBundleCommand command;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
@@ -64,18 +65,29 @@ void main() {
argResults = _MockArgResults();
doctor = _MockDoctor();
logger = _MockLogger();
processResult = _MockProcessResult();
buildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdProcess = _MockShorebirdProcess();
shorebirdValidator = _MockShorebirdValidator();
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => shorebirdProcess.run(
any(),
any(),
runInShell: any(named: 'runInShell'),
),
).thenAnswer((_) async => processResult);
).thenAnswer((_) async => buildProcessResult);
when(() => argResults.rest).thenReturn([]);
when(() => logger.progress(any())).thenReturn(_MockProgress());
when(() => logger.info(any())).thenReturn(null);
@@ -121,8 +133,8 @@ void main() {
});
test('exits with code 70 when building appbundle fails', () async {
when(() => processResult.exitCode).thenReturn(1);
when(() => processResult.stderr).thenReturn('oops');
when(() => buildProcessResult.exitCode).thenReturn(1);
when(() => buildProcessResult.stderr).thenReturn('oops');
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
@@ -141,7 +153,7 @@ void main() {
});
test('exits with code 0 when building appbundle succeeds', () async {
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -173,7 +185,7 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'bundle', 'release', 'app-rel
final target = p.join('lib', 'main_development.dart');
when(() => argResults['flavor']).thenReturn(flavor);
when(() => argResults['target']).thenReturn(target);
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -241,5 +253,25 @@ ${lightCyan.wrap(p.join('build', 'app', 'outputs', 'bundle', '${flavor}Release',
throwsException,
);
});
test('runs flutter pub get with system flutter after successful build',
() async {
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
});
}
@@ -38,7 +38,8 @@ void main() {
late ArgResults argResults;
late Doctor doctor;
late Logger logger;
late ShorebirdProcessResult processResult;
late ShorebirdProcessResult buildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late BuildIpaCommand command;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
@@ -65,17 +66,28 @@ void main() {
doctor = _MockDoctor();
logger = _MockLogger();
shorebirdProcess = _MockShorebirdProcess();
processResult = _MockProcessResult();
buildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdValidator = _MockShorebirdValidator();
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => shorebirdProcess.run(
any(),
any(),
runInShell: any(named: 'runInShell'),
),
).thenAnswer((_) async => processResult);
).thenAnswer((_) async => buildProcessResult);
when(() => argResults['codesign']).thenReturn(true);
when(() => argResults.rest).thenReturn([]);
when(() => logger.progress(any())).thenReturn(_MockProgress());
@@ -120,8 +132,8 @@ void main() {
});
test('exits with code 70 when building ipa fails', () async {
when(() => processResult.exitCode).thenReturn(1);
when(() => processResult.stderr).thenReturn('oops');
when(() => buildProcessResult.exitCode).thenReturn(1);
when(() => buildProcessResult.stderr).thenReturn('oops');
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
@@ -144,7 +156,7 @@ void main() {
});
test('exits with code 0 when building ipa succeeds', () async {
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -179,6 +191,26 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
]);
});
test('runs flutter pub get with system flutter after successful build',
() async {
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test(
'exits with code 0 when building ipa succeeds '
'with flavor and target', () async {
@@ -186,7 +218,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
final target = p.join('lib', 'main_development.dart');
when(() => argResults['flavor']).thenReturn(flavor);
when(() => argResults['target']).thenReturn(target);
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -231,7 +263,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
'exits with code 0 when building ipa succeeds '
'with --no-codesign', () async {
when(() => argResults['codesign']).thenReturn(false);
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -269,7 +301,7 @@ ${lightCyan.wrap(p.join('build', 'ios', 'ipa', 'Runner.ipa'))}''',
test('provides appropriate ExportOptions.plist to build ipa command',
() async {
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
when(() => buildProcessResult.exitCode).thenReturn(ExitCode.success.code);
final tempDir = Directory.systemTemp.createTempSync();
final result = await IOOverrides.runZoned(
() async => runWithOverrides(command.run),
@@ -114,6 +114,7 @@ void main() {
late Progress progress;
late Logger logger;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdProcessResult patchProcessResult;
late http.Client httpClient;
late Cache cache;
@@ -194,6 +195,7 @@ void main() {
progress = _MockProgress();
logger = _MockLogger();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
patchProcessResult = _MockProcessResult();
httpClient = _MockHttpClient();
cache = _MockCache();
@@ -213,6 +215,14 @@ void main() {
when(() => shorebirdEnv.getShorebirdYaml()).thenReturn(shorebirdYaml);
when(() => shorebirdEnv.flutterRevision).thenReturn(flutterRevision);
when(() => shorebirdEnv.isRunningOnCI).thenReturn(false);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
@@ -257,6 +267,9 @@ void main() {
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(
() => flutterPubGetProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => patchProcessResult.exitCode).thenReturn(ExitCode.success.code);
when(() => httpClient.send(any())).thenAnswer(
(_) async => http.StreamedResponse(const Stream.empty(), HttpStatus.ok),
@@ -807,6 +820,26 @@ Please re-run the release command for this version or create a new release.'''),
).called(1);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempDir();
setUpTempArtifacts(tempDir);
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test('does not prompt if running on CI', () async {
when(() => shorebirdEnv.isRunningOnCI).thenReturn(true);
final tempDir = setUpTempDir();
@@ -136,6 +136,7 @@ flutter:
late Logger logger;
late ShorebirdEnv shorebirdEnv;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdProcessResult patchProcessResult;
late http.Client httpClient;
late Cache cache;
@@ -223,6 +224,7 @@ flutter:
progress = _MockProgress();
logger = _MockLogger();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
patchProcessResult = _MockProcessResult();
httpClient = _MockHttpClient();
flutterValidator = _MockShorebirdFlutterValidator();
@@ -249,6 +251,14 @@ flutter:
runInShell: any(named: 'runInShell'),
),
).thenAnswer((_) async => flutterBuildProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
any(that: endsWith('patch')),
@@ -296,6 +306,9 @@ flutter:
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => flutterPubGetProcessResult.exitCode).thenReturn(
ExitCode.success.code,
);
when(() => httpClient.send(any())).thenAnswer(
(_) async => http.StreamedResponse(const Stream.empty(), HttpStatus.ok),
);
@@ -751,6 +764,25 @@ Or change your Flutter version and try again using:
expect(exitCode, ExitCode.success.code);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempDir();
setUpTempArtifacts(tempDir);
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test(
'succeeds when patch is successful '
'with flavors and target', () async {
@@ -135,6 +135,7 @@ flutter:
late Platform platform;
late ShorebirdProcessResult aotBuildProcessResult;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late http.Client httpClient;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -234,6 +235,7 @@ flutter:
platform = _MockPlatform();
aotBuildProcessResult = _MockProcessResult();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
httpClient = _MockHttpClient();
patchDiffChecker = _MockPatchDiffChecker();
shorebirdEnv = _MockShorebirdEnv();
@@ -296,6 +298,16 @@ flutter:
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
@@ -785,6 +797,26 @@ Or change your Flutter version and try again using:
expect(exitCode, ExitCode.success.code);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempDir();
setUpTempArtifacts(tempDir);
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test(
'succeeds when patch is successful '
'with flavors and target', () async {
@@ -110,6 +110,7 @@ flutter:
late Logger logger;
late ShorebirdProcessResult aotBuildProcessResult;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
late ShorebirdFlutterValidator flutterValidator;
@@ -210,12 +211,21 @@ flutter:
logger = _MockLogger();
aotBuildProcessResult = _MockProcessResult();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
shorebirdEnv = _MockShorebirdEnv();
shorebirdFlutter = _MockShorebirdFlutter();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdProcess = _MockShorebirdProcess();
shorebirdValidator = _MockShorebirdValidator();
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
@@ -251,6 +261,8 @@ flutter:
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => codePushClientWrapper.getApp(appId: any(named: 'appId')),
).thenAnswer((_) async => appMetadata);
@@ -717,6 +729,26 @@ Please re-run the release command for this version or create a new release.'''),
expect(exitCode, ExitCode.success.code);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempDir();
setUpTempArtifacts(tempDir);
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test('does not prompt if running on CI', () async {
when(() => shorebirdEnv.isRunningOnCI).thenReturn(true);
final tempDir = setUpTempDir();
@@ -82,6 +82,7 @@ void main() {
late Progress progress;
late Logger logger;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdEnv shorebirdEnv;
late ShorebirdProcess shorebirdProcess;
late ShorebirdValidator shorebirdValidator;
@@ -151,6 +152,7 @@ void main() {
progress = _MockProgress();
logger = _MockLogger();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
shorebirdProcess = _MockShorebirdProcess();
shorebirdRoot = Directory.systemTemp.createTempSync();
shorebirdEnv = _MockShorebirdEnv();
@@ -174,7 +176,18 @@ void main() {
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(
() => flutterPubGetProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
any(),
@@ -385,6 +398,25 @@ void main() {
).called(1);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempArtifacts();
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test('does not create new release if existing release is present',
() async {
when(
@@ -98,6 +98,7 @@ void main() {
late Progress progress;
late Logger logger;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
@@ -145,6 +146,7 @@ void main() {
progress = _MockProgress();
logger = _MockLogger();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdProcess = _MockShorebirdProcess();
shorebirdEnv = _MockShorebirdEnv();
@@ -155,6 +157,14 @@ void main() {
when(() => shorebirdEnv.flutterRevision).thenReturn(flutterRevision);
when(() => shorebirdEnv.isRunningOnCI).thenReturn(false);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
@@ -181,6 +191,8 @@ void main() {
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => codePushClientWrapper.getApp(appId: any(named: 'appId')),
).thenAnswer((_) async => appMetadata);
@@ -426,6 +438,36 @@ void main() {
expect(exitCode, ExitCode.success.code);
});
test('runs flutter pub get with system flutter after successful build',
() async {
await runWithOverrides(command.run);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test('prints error message if system flutter pub get fails', () async {
when(() => flutterPubGetProcessResult.exitCode).thenReturn(1);
await runWithOverrides(command.run);
verify(
() => logger.warn(
'''
Build was successful, but `flutter pub get` failed to run after the build completed. You may see unexpected behavior in VS Code.
Either run `flutter pub get` manually, or follow the steps in ${link(uri: Uri.parse('https://docs.shorebird.dev/troubleshooting#i-installed-shorebird-and-now-i-cant-run-my-app-in-vs-code'))}.
''',
),
).called(1);
});
test(
'succeeds when release is successful '
'with flavors and target', () async {
@@ -107,6 +107,7 @@ flutter:
late Progress progress;
late Logger logger;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
@@ -165,6 +166,7 @@ flutter:
progress = _MockProgress();
logger = _MockLogger();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdProcess = _MockShorebirdProcess();
shorebirdEnv = _MockShorebirdEnv();
@@ -174,6 +176,14 @@ flutter:
when(() => shorebirdEnv.shorebirdRoot).thenReturn(shorebirdRoot);
when(() => shorebirdEnv.flutterRevision).thenReturn(flutterRevision);
when(() => shorebirdEnv.isRunningOnCI).thenReturn(false);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
@@ -196,6 +206,8 @@ flutter:
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(
() => codePushClientWrapper.getApp(appId: any(named: 'appId')),
).thenAnswer((_) async => appMetadata);
@@ -507,6 +519,25 @@ error: exportArchive: No signing certificate "iOS Distribution" found
expect(exitCode, ExitCode.success.code);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempDir();
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
test(
'succeeds when release is successful '
'with flavors and target', () async {
@@ -88,6 +88,7 @@ flutter:
late Progress progress;
late Logger logger;
late ShorebirdProcessResult flutterBuildProcessResult;
late ShorebirdProcessResult flutterPubGetProcessResult;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
@@ -138,6 +139,7 @@ flutter:
progress = _MockProgress();
logger = _MockLogger();
flutterBuildProcessResult = _MockProcessResult();
flutterPubGetProcessResult = _MockProcessResult();
flutterValidator = _MockShorebirdFlutterValidator();
shorebirdProcess = _MockShorebirdProcess();
shorebirdEnv = _MockShorebirdEnv();
@@ -146,6 +148,14 @@ flutter:
when(() => shorebirdEnv.getShorebirdYaml()).thenReturn(shorebirdYaml);
when(() => shorebirdEnv.shorebirdRoot).thenReturn(shorebirdRoot);
when(() => shorebirdEnv.flutterRevision).thenReturn(flutterRevision);
when(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).thenAnswer((_) async => flutterPubGetProcessResult);
when(
() => shorebirdProcess.run(
'flutter',
@@ -161,6 +171,8 @@ flutter:
when(
() => flutterBuildProcessResult.exitCode,
).thenReturn(ExitCode.success.code);
when(() => flutterPubGetProcessResult.exitCode)
.thenReturn(ExitCode.success.code);
when(() => logger.progress(any())).thenReturn(progress);
when(() => logger.confirm(any())).thenReturn(true);
when(() => platform.operatingSystem).thenReturn(Platform.macOS);
@@ -374,5 +386,24 @@ flutter:
).called(1);
expect(exitCode, ExitCode.success.code);
});
test('runs flutter pub get with system flutter after successful build',
() async {
final tempDir = setUpTempDir();
await IOOverrides.runZoned(
() => runWithOverrides(command.run),
getCurrentDirectory: () => tempDir,
);
verify(
() => shorebirdProcess.run(
'flutter',
['pub', 'get', '--offline'],
runInShell: any(named: 'runInShell'),
useVendedFlutter: false,
),
).called(1);
});
});
}