Skip to content

Commit f8349eb

Browse files
authored
fix(mason_cli): update silently fails when the sdk is incompatible (#480)
1 parent dda5934 commit f8349eb

File tree

3 files changed

+78
-10
lines changed

3 files changed

+78
-10
lines changed

packages/dart_frog_cli/lib/src/commands/update/update.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:io';
2+
13
import 'package:args/command_runner.dart';
24
import 'package:dart_frog_cli/src/command_runner.dart';
35
import 'package:dart_frog_cli/src/version.dart';
@@ -44,13 +46,22 @@ class UpdateCommand extends Command<int> {
4446
}
4547

4648
final updateProgress = _logger.progress('Updating to $latestVersion');
49+
late ProcessResult result;
4750
try {
48-
await _pubUpdater.update(packageName: packageName);
51+
result = await _pubUpdater.update(
52+
packageName: packageName,
53+
versionConstraint: latestVersion,
54+
);
4955
} catch (error) {
5056
updateProgress.fail();
5157
_logger.err('$error');
5258
return ExitCode.software.code;
5359
}
60+
if (result.exitCode != ExitCode.success.code) {
61+
updateProgress.fail();
62+
_logger.err('Error updating Dart Frog CLI: ${result.stderr}');
63+
return ExitCode.software.code;
64+
}
5465
updateProgress.complete('Updated to $latestVersion');
5566

5667
return ExitCode.success.code;

packages/dart_frog_cli/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies:
1414
mason: ^0.1.0-dev.39
1515
meta: ^1.7.0
1616
path: ^1.8.1
17-
pub_updater: ^0.2.2
17+
pub_updater: ^0.2.4
1818
pubspec_parse: ^1.2.0
1919
stream_transform: ^2.0.0
2020
watcher: ^1.0.1

packages/dart_frog_cli/test/src/commands/update/update_test.dart

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class MockLogger extends Mock implements Logger {}
1212

1313
class MockPubUpdater extends Mock implements PubUpdater {}
1414

15-
class FakeProcessResult extends Fake implements ProcessResult {}
15+
class MockProcessResult extends Mock implements ProcessResult {}
1616

1717
class MockProgress extends Mock implements Progress {}
1818

@@ -23,18 +23,23 @@ void main() {
2323
late Logger logger;
2424
late PubUpdater pubUpdater;
2525
late UpdateCommand command;
26+
late ProcessResult processResult;
2627

2728
setUp(() {
2829
logger = MockLogger();
2930
pubUpdater = MockPubUpdater();
31+
processResult = MockProcessResult();
3032

3133
when(() => logger.progress(any())).thenReturn(MockProgress());
3234
when(
3335
() => pubUpdater.getLatestVersion(any()),
3436
).thenAnswer((_) async => packageVersion);
3537
when(
36-
() => pubUpdater.update(packageName: packageName),
37-
).thenAnswer((_) => Future.value(FakeProcessResult()));
38+
() => pubUpdater.update(
39+
packageName: packageName,
40+
versionConstraint: any(named: 'versionConstraint'),
41+
),
42+
).thenAnswer((_) => Future.value(processResult));
3843

3944
command = UpdateCommand(logger: logger, pubUpdater: pubUpdater);
4045
});
@@ -48,7 +53,10 @@ void main() {
4853
verify(() => logger.progress('Checking for updates')).called(1);
4954
verify(() => logger.err('Exception: oops'));
5055
verifyNever(
51-
() => pubUpdater.update(packageName: any(named: 'packageName')),
56+
() => pubUpdater.update(
57+
packageName: any(named: 'packageName'),
58+
versionConstraint: any(named: 'versionConstraint'),
59+
),
5260
);
5361
});
5462

@@ -57,27 +65,71 @@ void main() {
5765
() => pubUpdater.getLatestVersion(any()),
5866
).thenAnswer((_) async => latestVersion);
5967
when(
60-
() => pubUpdater.update(packageName: any(named: 'packageName')),
68+
() => pubUpdater.update(
69+
packageName: any(named: 'packageName'),
70+
versionConstraint: any(named: 'versionConstraint'),
71+
),
6172
).thenThrow(Exception('oops'));
6273
final result = await command.run();
6374
expect(result, equals(ExitCode.software.code));
6475
verify(() => logger.progress('Checking for updates')).called(1);
6576
verify(() => logger.err('Exception: oops'));
6677
verify(
67-
() => pubUpdater.update(packageName: any(named: 'packageName')),
78+
() => pubUpdater.update(
79+
packageName: any(named: 'packageName'),
80+
versionConstraint: any(named: 'versionConstraint'),
81+
),
82+
).called(1);
83+
});
84+
85+
test('handles pub update process errors', () async {
86+
const error = 'Oh no! Installing this is not possible right now!';
87+
when(() => processResult.exitCode).thenReturn(1);
88+
when<dynamic>(() => processResult.stderr).thenReturn(error);
89+
when(
90+
() => pubUpdater.getLatestVersion(any()),
91+
).thenAnswer((_) async => latestVersion);
92+
when(
93+
() => pubUpdater.update(
94+
packageName: any(named: 'packageName'),
95+
versionConstraint: any(named: 'versionConstraint'),
96+
),
97+
).thenAnswer((_) => Future.value(processResult));
98+
99+
final result = await command.run();
100+
expect(result, equals(ExitCode.software.code));
101+
verify(() => logger.progress('Checking for updates')).called(1);
102+
verify(() => logger.err('Error updating Dart Frog CLI: $error'));
103+
verify(
104+
() => pubUpdater.update(
105+
packageName: any(named: 'packageName'),
106+
versionConstraint: any(named: 'versionConstraint'),
107+
),
68108
).called(1);
69109
});
70110

71111
test('updates when newer version exists', () async {
72112
when(
73113
() => pubUpdater.getLatestVersion(any()),
74114
).thenAnswer((_) async => latestVersion);
115+
when(
116+
() => pubUpdater.update(
117+
packageName: any(named: 'packageName'),
118+
versionConstraint: any(named: 'versionConstraint'),
119+
),
120+
).thenAnswer((_) => Future.value(processResult));
121+
when(() => processResult.exitCode).thenReturn(0);
75122
when(() => logger.progress(any())).thenReturn(MockProgress());
76123
final result = await command.run();
77124
expect(result, equals(ExitCode.success.code));
78125
verify(() => logger.progress('Checking for updates')).called(1);
79126
verify(() => logger.progress('Updating to $latestVersion')).called(1);
80-
verify(() => pubUpdater.update(packageName: packageName)).called(1);
127+
verify(
128+
() => pubUpdater.update(
129+
packageName: packageName,
130+
versionConstraint: latestVersion,
131+
),
132+
).called(1);
81133
});
82134

83135
test('does not update when already on latest version', () async {
@@ -91,7 +143,12 @@ void main() {
91143
() => logger.info('$packageName is already at the latest version.'),
92144
).called(1);
93145
verifyNever(() => logger.progress('Updating to $latestVersion'));
94-
verifyNever(() => pubUpdater.update(packageName: packageName));
146+
verifyNever(
147+
() => pubUpdater.update(
148+
packageName: any(named: 'packageName'),
149+
versionConstraint: any(named: 'versionConstraint'),
150+
),
151+
);
95152
});
96153
});
97154
}

0 commit comments

Comments
 (0)