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: add input prompt component #14

Merged
merged 3 commits into from
Jan 17, 2025
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions lib/src/prompts/input.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'dart:io';

import 'package:cli_tools/cli_tools.dart';

/// Prompts the user for input.
/// If [defaultValue] is provided, the user can skip the prompt by pressing Enter.
Future<String> input(
String message, {
String? defaultValue,
required Logger logger,
}) async {
var defaultDescription = defaultValue == null ? '' : ' ($defaultValue)';

logger.write(
'$message$defaultDescription: ',
LogLevel.info,
newLine: false,
newParagraph: false,
);
var input = stdin.readLineSync()?.trim();
var missingInput = input == null || input.isEmpty;
SandPod marked this conversation as resolved.
Show resolved Hide resolved
if (missingInput) {
return defaultValue ?? '';
}

return input;
}
129 changes: 129 additions & 0 deletions test/prompts/input_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import 'package:cli_tools/cli_tools.dart';
import 'package:cli_tools/src/prompts/input.dart';
import 'package:test/test.dart';

import '../test_utils/io_helper.dart';

void main() {
var logger = StdOutLogger(LogLevel.debug);

test(
'Given input prompt '
'when providing valid input "HelloWorld" '
'then should return the input', () async {
late Future<String> result;
await collectOutput(
stdinLines: ['HelloWorld'],
() {
result = input(
'Enter something',
logger: logger,
);
},
);

await expectLater(
result,
completion('HelloWorld'),
);
});

test(
'Given input prompt '
'when providing empty input with default value "default" '
'then should return "default"', () async {
late Future<String> result;
await collectOutput(
stdinLines: [''],
() async {
result = input(
'Enter something',
defaultValue: 'default',
logger: logger,
);
},
);

await expectLater(
result,
completion('default'),
);
});

test(
'Given input prompt '
'when providing empty input without default value '
'then should return an empty string', () async {
late Future<String> result;
await collectOutput(
stdinLines: [''],
() async {
result = input(
'Enter something',
logger: logger,
);
},
);

await expectLater(
result,
completion(''),
);
});

test(
'Given input prompt '
'when providing input with leading and trailing spaces '
'then should trim string', () async {
late Future<String> result;
await collectOutput(
stdinLines: [' hello '],
() async {
result = input(
'Enter something',
logger: logger,
);
},
);

await expectLater(
result,
completion('hello'),
);
});

test(
'Given input prompt '
'when providing defult value '
'then should display prompt with default value', () async {
var (:stdout, :stderr, :stdin) = await collectOutput(
stdinLines: [''],
() async {
await input(
'Enter something',
defaultValue: 'default',
logger: logger,
);
},
);

expect(stdout.output, 'Enter something (default): ');
});

test(
'Given input prompt '
'when providing no default value '
'then should not display a default description', () async {
var (:stdout, :stderr, :stdin) = await collectOutput(
stdinLines: ['value'],
() async {
await input(
'Enter something',
logger: logger,
);
},
);

expect(stdout.output, 'Enter something: ');
});
}
Loading