From 7e6835340cac283eb8bec0f268539018a0528593 Mon Sep 17 00:00:00 2001 From: Renan Araujo Date: Wed, 19 Oct 2022 17:41:45 -0300 Subject: [PATCH 1/4] fix: update prompt on update --- lib/src/command_runner.dart | 7 ++- lib/src/commands/update.dart | 4 +- test/src/command_runner_test.dart | 82 +++++++++++++++++-------------- 3 files changed, 55 insertions(+), 38 deletions(-) diff --git a/lib/src/command_runner.dart b/lib/src/command_runner.dart index e8e2cc46c..e302a48de 100644 --- a/lib/src/command_runner.dart +++ b/lib/src/command_runner.dart @@ -61,6 +61,9 @@ class VeryGoodCommandRunner extends CommandRunner { final Analytics _analytics; final PubUpdater _pubUpdater; + @override + void printUsage() => _logger.info(usage); + @override Future run(Iterable args) async { try { @@ -140,7 +143,9 @@ class VeryGoodCommandRunner extends CommandRunner { } else { exitCode = await super.runCommand(topLevelResults); } - await _checkForUpdates(); + if (topLevelResults.command?.name != UpdateCommand.commandName) { + await _checkForUpdates(); + } return exitCode; } diff --git a/lib/src/commands/update.dart b/lib/src/commands/update.dart index 6687d7870..829e97bce 100644 --- a/lib/src/commands/update.dart +++ b/lib/src/commands/update.dart @@ -21,8 +21,10 @@ class UpdateCommand extends Command { @override String get description => 'Update Very Good CLI.'; + static const String commandName = 'update'; + @override - String get name => 'update'; + String get name => commandName; @override Future run() async { diff --git a/test/src/command_runner_test.dart b/test/src/command_runner_test.dart index b1eaab26f..0954c23ee 100644 --- a/test/src/command_runner_test.dart +++ b/test/src/command_runner_test.dart @@ -1,5 +1,6 @@ // ignore_for_file: no_adjacent_strings_in_list import 'dart:async'; +import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:mason/mason.dart' hide packageVersion; @@ -16,6 +17,10 @@ class MockLogger extends Mock implements Logger {} class MockPubUpdater extends Mock implements PubUpdater {} +class MockProgress extends Mock implements Progress {} + +class FakeProcessResult extends Fake implements ProcessResult {} + const expectedUsage = [ '🦄 A Very Good Command-Line Interface\n' '\n' @@ -53,26 +58,12 @@ Run ${lightCyan.wrap('very_good update')} to update'''; void main() { group('VeryGoodCommandRunner', () { - late List printLogs; late Analytics analytics; late PubUpdater pubUpdater; late Logger logger; late VeryGoodCommandRunner commandRunner; - void Function() overridePrint(void Function() fn) { - return () { - final spec = ZoneSpecification( - print: (_, __, ___, String msg) { - printLogs.add(msg); - }, - ); - return Zone.current.fork(specification: spec).run(fn); - }; - } - setUp(() { - printLogs = []; - analytics = MockAnalytics(); pubUpdater = MockPubUpdater(); @@ -108,6 +99,33 @@ void main() { verify(() => logger.info(updatePrompt)).called(1); }); + test('doesnt show update message when nsuing update command', () async { + when( + () => pubUpdater.getLatestVersion(any()), + ).thenAnswer((_) async => latestVersion); + when( + () => pubUpdater.update(packageName: packageName), + ).thenAnswer((_) => Future.value(FakeProcessResult())); + when( + () => pubUpdater.isUpToDate( + packageName: any(named: 'packageName'), + currentVersion: any(named: 'currentVersion'), + ), + ).thenAnswer((_) => Future.value(true)); + + final progress = MockProgress(); + final progressLogs = []; + when(() => progress.complete(any())).thenAnswer((_) { + final message = _.positionalArguments.elementAt(0) as String?; + if (message != null) progressLogs.add(message); + }); + when(() => logger.progress(any())).thenReturn(progress); + + final result = await commandRunner.run(['update']); + expect(result, equals(ExitCode.success.code)); + verifyNever(() => logger.info(updatePrompt)); + }); + test('handles pub update errors gracefully', () async { when( () => pubUpdater.getLatestVersion(any()), @@ -164,30 +182,22 @@ void main() { verify(() => logger.info('exception usage')).called(1); }); - test( - 'handles no command', - overridePrint(() async { - final result = await commandRunner.run([]); - expect(printLogs, equals(expectedUsage)); - expect(result, equals(ExitCode.success.code)); - }), - ); + test('handles no command', () async { + final result = await commandRunner.run([]); + verify(() => logger.info(expectedUsage.join())).called(1); + expect(result, equals(ExitCode.success.code)); + }); group('--help', () { - test( - 'outputs usage', - overridePrint(() async { - final result = await commandRunner.run(['--help']); - expect(printLogs, equals(expectedUsage)); - expect(result, equals(ExitCode.success.code)); - - printLogs.clear(); - - final resultAbbr = await commandRunner.run(['-h']); - expect(printLogs, equals(expectedUsage)); - expect(resultAbbr, equals(ExitCode.success.code)); - }), - ); + test('outputs usage', () async { + final result = await commandRunner.run(['--help']); + verify(() => logger.info(expectedUsage.join())).called(1); + expect(result, equals(ExitCode.success.code)); + + final resultAbbr = await commandRunner.run(['-h']); + verify(() => logger.info(expectedUsage.join())).called(1); + expect(resultAbbr, equals(ExitCode.success.code)); + }); }); group('--analytics', () { From 2592dd625123796625a2c81e25af42dc01aac684 Mon Sep 17 00:00:00 2001 From: Renan Araujo Date: Wed, 19 Oct 2022 17:48:25 -0300 Subject: [PATCH 2/4] gimme a break --- lib/src/commands/update.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/commands/update.dart b/lib/src/commands/update.dart index 829e97bce..40df0ecee 100644 --- a/lib/src/commands/update.dart +++ b/lib/src/commands/update.dart @@ -21,6 +21,7 @@ class UpdateCommand extends Command { @override String get description => 'Update Very Good CLI.'; + /// The [name] of the command. But static. static const String commandName = 'update'; @override From 395029859728727b76e40e7e8a1cf0a389159cba Mon Sep 17 00:00:00 2001 From: Renan <6718144+renancaraujo@users.noreply.github.com> Date: Thu, 20 Oct 2022 09:18:14 -0300 Subject: [PATCH 3/4] Update test/src/command_runner_test.dart Co-authored-by: Jochum van der Ploeg --- test/src/command_runner_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/command_runner_test.dart b/test/src/command_runner_test.dart index 0954c23ee..759af84b4 100644 --- a/test/src/command_runner_test.dart +++ b/test/src/command_runner_test.dart @@ -99,7 +99,7 @@ void main() { verify(() => logger.info(updatePrompt)).called(1); }); - test('doesnt show update message when nsuing update command', () async { + test('doesnt show update message when using the update command', () async { when( () => pubUpdater.getLatestVersion(any()), ).thenAnswer((_) async => latestVersion); From 78af2daf1177a16ee9d74b52ee6c6a88ccd6e789 Mon Sep 17 00:00:00 2001 From: Renan Araujo Date: Thu, 20 Oct 2022 09:46:55 -0300 Subject: [PATCH 4/4] format --- test/src/command_runner_test.dart | 53 ++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/test/src/command_runner_test.dart b/test/src/command_runner_test.dart index 759af84b4..5f169b0b8 100644 --- a/test/src/command_runner_test.dart +++ b/test/src/command_runner_test.dart @@ -99,32 +99,35 @@ void main() { verify(() => logger.info(updatePrompt)).called(1); }); - test('doesnt show update message when using the update command', () async { - when( - () => pubUpdater.getLatestVersion(any()), - ).thenAnswer((_) async => latestVersion); - when( - () => pubUpdater.update(packageName: packageName), - ).thenAnswer((_) => Future.value(FakeProcessResult())); - when( - () => pubUpdater.isUpToDate( - packageName: any(named: 'packageName'), - currentVersion: any(named: 'currentVersion'), - ), - ).thenAnswer((_) => Future.value(true)); - - final progress = MockProgress(); - final progressLogs = []; - when(() => progress.complete(any())).thenAnswer((_) { - final message = _.positionalArguments.elementAt(0) as String?; - if (message != null) progressLogs.add(message); - }); - when(() => logger.progress(any())).thenReturn(progress); + test( + 'doesnt show update message when using the update command', + () async { + when( + () => pubUpdater.getLatestVersion(any()), + ).thenAnswer((_) async => latestVersion); + when( + () => pubUpdater.update(packageName: packageName), + ).thenAnswer((_) => Future.value(FakeProcessResult())); + when( + () => pubUpdater.isUpToDate( + packageName: any(named: 'packageName'), + currentVersion: any(named: 'currentVersion'), + ), + ).thenAnswer((_) => Future.value(true)); - final result = await commandRunner.run(['update']); - expect(result, equals(ExitCode.success.code)); - verifyNever(() => logger.info(updatePrompt)); - }); + final progress = MockProgress(); + final progressLogs = []; + when(() => progress.complete(any())).thenAnswer((_) { + final message = _.positionalArguments.elementAt(0) as String?; + if (message != null) progressLogs.add(message); + }); + when(() => logger.progress(any())).thenReturn(progress); + + final result = await commandRunner.run(['update']); + expect(result, equals(ExitCode.success.code)); + verifyNever(() => logger.info(updatePrompt)); + }, + ); test('handles pub update errors gracefully', () async { when(