Skip to content

Commit 214ffc4

Browse files
authored
test(dart_frog_cli): mock stdin in the command run level (#885)
1 parent 2797c04 commit 214ffc4

File tree

10 files changed

+57
-20
lines changed

10 files changed

+57
-20
lines changed

packages/dart_frog_cli/e2e/test/new_test.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,10 @@ void main() {
356356
);
357357

358358
expect(
359-
fileAt('prefix/[existing_dynamic_route]/index.dart',
360-
on: routesDirectory),
359+
fileAt(
360+
'prefix/[existing_dynamic_route]/index.dart',
361+
on: routesDirectory,
362+
),
361363
exists,
362364
);
363365

packages/dart_frog_cli/lib/src/command.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:io';
22

33
import 'package:args/args.dart';
44
import 'package:args/command_runner.dart';
5+
import 'package:dart_frog_cli/src/command_runner.dart';
56
import 'package:mason/mason.dart';
67
import 'package:meta/meta.dart';
78

@@ -23,6 +24,12 @@ abstract class DartFrogCommand extends Command<int> {
2324
/// Current working directory used for testing purposes only.
2425
Directory? testCwd;
2526

27+
/// [stdin] used for testing purposes only.
28+
Stdin? testStdin;
29+
30+
/// The [Stdin] instance to be used by the commands.
31+
Stdin get stdin => testStdin ?? (runner as DartFrogCommandRunner?)!.stdin;
32+
2633
/// [ArgResults] for the current command.
2734
ArgResults get results => testArgResults ?? argResults!;
2835

packages/dart_frog_cli/lib/src/command_runner.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ class DartFrogCommandRunner extends CompletionCommandRunner<int> {
3232
PubUpdater? pubUpdater,
3333
io.ProcessSignal? sigint,
3434
Exit? exit,
35+
io.Stdin? stdin,
3536
}) : _logger = logger ?? Logger(),
3637
_pubUpdater = pubUpdater ?? PubUpdater(),
3738
_sigint = sigint ?? io.ProcessSignal.sigint,
3839
_exit = exit ?? io.exit,
40+
stdin = stdin ?? io.stdin,
3941
super(executableName, executableDescription) {
4042
argParser.addFlags();
4143
addCommand(BuildCommand(logger: _logger));
@@ -53,6 +55,9 @@ class DartFrogCommandRunner extends CompletionCommandRunner<int> {
5355
final io.ProcessSignal _sigint;
5456
final Exit _exit;
5557

58+
/// The [io.Stdin] instance to be used by the commands.
59+
final io.Stdin stdin;
60+
5661
@override
5762
Future<int> run(Iterable<String> args) async {
5863
late final ArgResults argResults;

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ class DevCommand extends DartFrogCommand {
2020
DevServerRunnerBuilder? devServerRunnerBuilder,
2121
runtime_compatibility.RuntimeCompatibilityCallback?
2222
ensureRuntimeCompatibility,
23-
io.Stdin? stdin,
2423
}) : _ensureRuntimeCompatibility = ensureRuntimeCompatibility ??
2524
runtime_compatibility.ensureRuntimeCompatibility,
2625
_generator = generator ?? MasonGenerator.fromBundle,
27-
_devServerRunnerBuilder = devServerRunnerBuilder ?? DevServerRunner.new,
28-
_stdin = stdin ?? io.stdin {
26+
_devServerRunnerBuilder =
27+
devServerRunnerBuilder ?? DevServerRunner.new {
2928
argParser
3029
..addOption(
3130
'port',
@@ -47,7 +46,6 @@ class DevCommand extends DartFrogCommand {
4746
final DevServerRunnerBuilder _devServerRunnerBuilder;
4847
final runtime_compatibility.RuntimeCompatibilityCallback
4948
_ensureRuntimeCompatibility;
50-
final io.Stdin _stdin;
5149

5250
@override
5351
final String description = 'Run a local development server.';
@@ -61,14 +59,14 @@ class DevCommand extends DartFrogCommand {
6159

6260
void _startListeningForHelpers() {
6361
if (_stdinSubscription != null) return;
64-
if (!_stdin.hasTerminal) return;
62+
if (!stdin.hasTerminal) return;
6563

6664
// listen for the R key
67-
_stdin
65+
stdin
6866
..echoMode = false
6967
..lineMode = false;
7068

71-
_stdinSubscription = _stdin.listen(
69+
_stdinSubscription = stdin.listen(
7270
(event) {
7371
if (event.length == 1 && event.first == 'R'.codeUnitAt(0)) {
7472
_devServerRunner.reload();
@@ -94,9 +92,9 @@ class DevCommand extends DartFrogCommand {
9492
// devserver started.
9593
// That is why this check is made after the subscription
9694
// is canceled, if existent.
97-
if (!_stdin.hasTerminal) return;
95+
if (!stdin.hasTerminal) return;
9896

99-
_stdin
97+
stdin
10098
..lineMode = true
10199
..echoMode = true;
102100
}

packages/dart_frog_cli/test/src/command_runner_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class _MockPubUpdater extends Mock implements PubUpdater {}
1717

1818
class _MockProcessSignal extends Mock implements ProcessSignal {}
1919

20+
class _MockStdin extends Mock implements Stdin {}
21+
2022
const expectedUsage = [
2123
'A fast, minimalistic backend framework for Dart.\n'
2224
'\n'
@@ -78,6 +80,7 @@ void main() {
7880
pubUpdater: pubUpdater,
7981
exit: (_) {},
8082
sigint: sigint,
83+
stdin: _MockStdin(),
8184
);
8285
});
8386

@@ -114,6 +117,7 @@ void main() {
114117
pubUpdater: pubUpdater,
115118
exit: exitCalls.add,
116119
sigint: sigint,
120+
stdin: _MockStdin(),
117121
);
118122
when(() => sigint.watch()).thenAnswer((_) => Stream.value(sigint));
119123
await commandRunner.run(['--version']);

packages/dart_frog_cli/test/src/commands/daemon/daemon_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class _MockLogger extends Mock implements Logger {}
1919

2020
class _MockProcessSignal extends Mock implements ProcessSignal {}
2121

22+
class _MockStdin extends Mock implements Stdin {}
23+
2224
const expectedUsage = [
2325
// ignore: no_adjacent_strings_in_list
2426
'Start the Dart Frog daemon\n'
@@ -44,6 +46,7 @@ void main() {
4446
pubUpdater: _MockPubUpdater(),
4547
exit: (_) {},
4648
sigint: sigint,
49+
stdin: _MockStdin(),
4750
);
4851
});
4952

packages/dart_frog_cli/test/src/commands/dev/dev_test.dart

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ void main() {
6262
return runner;
6363
},
6464
logger: logger,
65-
stdin: stdin,
66-
)..testArgResults = argResults;
65+
)
66+
..testArgResults = argResults
67+
..testStdin = stdin;
6768

6869
expect(
6970
command.run(),
@@ -107,8 +108,8 @@ void main() {
107108
return runner;
108109
},
109110
logger: logger,
110-
stdin: stdin,
111111
)
112+
..testStdin = stdin
112113
..testArgResults = argResults
113114
..testCwd = cwd;
114115

@@ -138,8 +139,14 @@ void main() {
138139
return runner;
139140
},
140141
logger: logger,
141-
stdin: stdin,
142-
)..testArgResults = argResults;
142+
)
143+
..testArgResults = argResults
144+
..testStdin = stdin;
145+
146+
when(() => runner.start()).thenAnswer((_) => Future.value());
147+
when(() => runner.exitCode).thenAnswer(
148+
(_) => Future.value(ExitCode.success),
149+
);
143150

144151
when(() => runner.start()).thenAnswer((_) => Future.value());
145152
when(() => runner.exitCode).thenAnswer((_) async => ExitCode.unavailable);
@@ -162,8 +169,9 @@ void main() {
162169
return runner;
163170
},
164171
logger: logger,
165-
stdin: stdin,
166-
)..testArgResults = argResults;
172+
)
173+
..testArgResults = argResults
174+
..testStdin = stdin;
167175

168176
when(() => runner.start()).thenAnswer((_) async {
169177
throw DartFrogDevServerException('oops');
@@ -229,8 +237,9 @@ void main() {
229237
return runner;
230238
},
231239
logger: logger,
232-
stdin: stdin,
233-
)..testArgResults = argResults;
240+
)
241+
..testArgResults = argResults
242+
..testStdin = stdin;
234243
});
235244

236245
test('listens for R on hot reload enabled', () async {

packages/dart_frog_cli/test/src/commands/list/list_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class _FakeDirectoryGeneratorTarget extends Fake
2828

2929
class _MockRouteConfiguration extends Mock implements RouteConfiguration {}
3030

31+
class _MockStdin extends Mock implements Stdin {}
32+
3133
const expectedUsage = [
3234
'Lists the routes on a Dart Frog project.\n'
3335
'\n'
@@ -76,6 +78,7 @@ void main() {
7678
pubUpdater: _MockPubUpdater(),
7779
exit: (_) {},
7880
sigint: sigint,
81+
stdin: _MockStdin(),
7982
);
8083
});
8184

packages/dart_frog_cli/test/src/commands/new/new_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class _MockProgress extends Mock implements Progress {}
2929
class _FakeDirectoryGeneratorTarget extends Fake
3030
implements DirectoryGeneratorTarget {}
3131

32+
class _MockStdin extends Mock implements Stdin {}
33+
3234
const expectedUsage = [
3335
'Create a new route or middleware for dart_frog\n'
3436
'\n'
@@ -79,6 +81,7 @@ void main() {
7981
pubUpdater: _MockPubUpdater(),
8082
exit: (_) {},
8183
sigint: sigint,
84+
stdin: _MockStdin(),
8285
);
8386
});
8487

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class _MockArgResults extends Mock implements ArgResults {}
2323

2424
class _MockProcessSignal extends Mock implements ProcessSignal {}
2525

26+
class _MockStdin extends Mock implements Stdin {}
27+
2628
const expectedUsage = [
2729
'Update the Dart Frog CLI.\n'
2830
'\n'
@@ -76,6 +78,7 @@ void main() {
7678
pubUpdater: _MockPubUpdater(),
7779
exit: (_) {},
7880
sigint: sigint,
81+
stdin: _MockStdin(),
7982
);
8083
});
8184

0 commit comments

Comments
 (0)