From e1799f6ecce6066b4ac9a2592e65e1c3302e7407 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Thu, 22 Dec 2022 23:47:13 -0600 Subject: [PATCH] feat(mason_cli): search separator length uses terminalColumns --- .../mason_cli/lib/src/commands/search.dart | 14 +++- .../mason_cli/test/commands/search_test.dart | 66 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/packages/mason_cli/lib/src/commands/search.dart b/packages/mason_cli/lib/src/commands/search.dart index 0306d7220..43f176c02 100644 --- a/packages/mason_cli/lib/src/commands/search.dart +++ b/packages/mason_cli/lib/src/commands/search.dart @@ -1,3 +1,6 @@ +import 'dart:io'; +import 'dart:math'; + import 'package:mason/mason.dart' hide packageVersion, Brick; import 'package:mason_api/mason_api.dart'; import 'package:mason_cli/src/command.dart'; @@ -52,7 +55,7 @@ class SearchCommand extends MasonCommand { ) ..info(brick.description) ..info(brickLink) - ..info(darkGray.wrap('-' * 80)); + ..info(darkGray.wrap('-' * _separatorLength())); } return ExitCode.success.code; } catch (error) { @@ -62,3 +65,12 @@ class SearchCommand extends MasonCommand { } } } + +int _separatorLength() { + const maxSeparatorLength = 80; + try { + return min(stdout.terminalColumns, maxSeparatorLength); + } catch (_) { + return maxSeparatorLength; + } +} diff --git a/packages/mason_cli/test/commands/search_test.dart b/packages/mason_cli/test/commands/search_test.dart index 5caa7def1..0fdc6750d 100644 --- a/packages/mason_cli/test/commands/search_test.dart +++ b/packages/mason_cli/test/commands/search_test.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:mason/mason.dart' hide Brick; @@ -16,6 +18,8 @@ class MockProgress extends Mock implements Progress {} class MockArgResults extends Mock implements ArgResults {} +class MockStdout extends Mock implements Stdout {} + void main() { group('SearchCommand', () { late Logger logger; @@ -23,6 +27,7 @@ void main() { late SearchCommand searchCommand; late ArgResults argResults; late BrickSearchResult brick; + late Stdout stdout; setUp(() { brick = BrickSearchResult( @@ -36,6 +41,7 @@ void main() { logger = MockLogger(); masonApi = MockMasonApi(); argResults = MockArgResults(); + stdout = MockStdout(); searchCommand = SearchCommand(logger: logger, masonApi: masonApi) ..testArgResults = argResults; @@ -154,5 +160,65 @@ void main() { ).called(1); verify(() => logger.err('$exception')).called(1); }); + + test('separator length is 80 when terminal is not available', () async { + final progress = MockProgress(); + when(() => progress.complete(any())).thenAnswer((_) {}); + when(() => logger.progress(any())).thenReturn(progress); + when(() => argResults.rest).thenReturn(['query']); + when( + () => masonApi.search(query: 'query'), + ).thenAnswer((_) async => [brick]); + + final result = await searchCommand.run(); + + expect(result, ExitCode.success.code); + + verify(() => logger.info(darkGray.wrap('-' * 80))).called(1); + }); + + test('separator length is 80 when terminalColumns > 80', () async { + final progress = MockProgress(); + when(() => progress.complete(any())).thenAnswer((_) {}); + when(() => logger.progress(any())).thenReturn(progress); + when(() => argResults.rest).thenReturn(['query']); + when( + () => masonApi.search(query: 'query'), + ).thenAnswer((_) async => [brick]); + when(() => stdout.hasTerminal).thenReturn(true); + when(() => stdout.terminalColumns).thenReturn(100); + when(() => stdout.supportsAnsiEscapes).thenReturn(true); + final result = await IOOverrides.runZoned( + () => searchCommand.run(), + stdout: () => stdout, + ); + + expect(result, ExitCode.success.code); + + verify(() => logger.info(darkGray.wrap('-' * 80))).called(1); + }); + + test( + 'separator length is terminalColumns ' + 'when terminalColumns < 80', () async { + final progress = MockProgress(); + when(() => progress.complete(any())).thenAnswer((_) {}); + when(() => logger.progress(any())).thenReturn(progress); + when(() => argResults.rest).thenReturn(['query']); + when( + () => masonApi.search(query: 'query'), + ).thenAnswer((_) async => [brick]); + when(() => stdout.hasTerminal).thenReturn(true); + when(() => stdout.terminalColumns).thenReturn(42); + when(() => stdout.supportsAnsiEscapes).thenReturn(true); + final result = await IOOverrides.runZoned( + () => searchCommand.run(), + stdout: () => stdout, + ); + + expect(result, ExitCode.success.code); + + verify(() => logger.info(darkGray.wrap('-' * 42))).called(1); + }); }); }