Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(mason_cli): search separator length uses terminalColumns #678

Merged
merged 1 commit into from Dec 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 13 additions & 1 deletion 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';
Expand Down Expand Up @@ -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) {
Expand All @@ -62,3 +65,12 @@ class SearchCommand extends MasonCommand {
}
}
}

int _separatorLength() {
const maxSeparatorLength = 80;
try {
return min(stdout.terminalColumns, maxSeparatorLength);
} catch (_) {
return maxSeparatorLength;
}
}
66 changes: 66 additions & 0 deletions 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;
Expand All @@ -16,13 +18,16 @@ 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;
late MasonApi masonApi;
late SearchCommand searchCommand;
late ArgResults argResults;
late BrickSearchResult brick;
late Stdout stdout;

setUp(() {
brick = BrickSearchResult(
Expand All @@ -36,6 +41,7 @@ void main() {
logger = MockLogger();
masonApi = MockMasonApi();
argResults = MockArgResults();
stdout = MockStdout();
searchCommand = SearchCommand(logger: logger, masonApi: masonApi)
..testArgResults = argResults;

Expand Down Expand Up @@ -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);
});
});
}