Skip to content

Commit 6aff75b

Browse files
authored
refactor(dart_frog_cli): do not mock process result (#652)
1 parent 5df00a0 commit 6aff75b

File tree

5 files changed

+78
-58
lines changed

5 files changed

+78
-58
lines changed

bricks/dart_frog_prod_server/hooks/test/post_gen_test.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,19 @@ class _MockLogger extends Mock implements Logger {}
3030

3131
class _MockProgress extends Mock implements Progress {}
3232

33-
class _MockProcessResult extends Mock implements ProcessResult {}
34-
3533
void main() {
3634
group('postGen', () {
3735
late HookContext context;
3836
late Logger logger;
3937

38+
const processId = 42;
39+
final processResult = ProcessResult(
40+
processId,
41+
ExitCode.success.code,
42+
'',
43+
'',
44+
);
45+
4046
setUp(() {
4147
logger = _MockLogger();
4248
context = _FakeHookContext(logger: logger);
@@ -57,8 +63,7 @@ void main() {
5763
test('runs dart pub get and outputs next steps', () async {
5864
var processRunnerCallCount = 0;
5965
final exitCalls = <int>[];
60-
final result = _MockProcessResult();
61-
when(() => result.exitCode).thenReturn(ExitCode.success.code);
66+
6267
await postGen(
6368
context,
6469
runProcess: (
@@ -75,7 +80,7 @@ void main() {
7580
equals(path.join(Directory.current.path, 'build')),
7681
);
7782
expect(runInShell, isTrue);
78-
return result;
83+
return processResult;
7984
},
8085
exit: exitCalls.add,
8186
);

bricks/dart_frog_prod_server/hooks/test/src/dart_pub_get_test.dart

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,19 @@ class _MockLogger extends Mock implements Logger {}
2727

2828
class _MockProgress extends Mock implements Progress {}
2929

30-
class _MockProcessResult extends Mock implements ProcessResult {}
31-
3230
void main() {
3331
group('dartPubGet', () {
3432
late HookContext context;
3533
late Logger logger;
3634

35+
const processId = 42;
36+
final processResult = ProcessResult(
37+
processId,
38+
ExitCode.success.code,
39+
'',
40+
'',
41+
);
42+
3743
setUp(() {
3844
logger = _MockLogger();
3945
context = _FakeHookContext(logger: logger);
@@ -43,8 +49,7 @@ void main() {
4349

4450
test('completes when process succeeds', () async {
4551
final exitCalls = <int>[];
46-
final result = _MockProcessResult();
47-
when(() => result.exitCode).thenReturn(ExitCode.success.code);
52+
4853
await dartPubGet(
4954
context,
5055
workingDirectory: '.',
@@ -58,7 +63,7 @@ void main() {
5863
expect(args, equals(['pub', 'get']));
5964
expect(workingDirectory, equals('.'));
6065
expect(runInShell, isTrue);
61-
return result;
66+
return processResult;
6267
},
6368
exit: exitCalls.add,
6469
);
@@ -69,10 +74,14 @@ void main() {
6974
test('exits when process fails', () async {
7075
const error = 'oops something went wrong';
7176
final exitCalls = <int>[];
72-
final result = _MockProcessResult();
73-
final code = ExitCode.software.code;
74-
when(() => result.exitCode).thenReturn(code);
75-
when(() => result.stderr).thenReturn(error);
77+
78+
final processResult = ProcessResult(
79+
processId,
80+
ExitCode.software.code,
81+
'',
82+
error,
83+
);
84+
7685
await dartPubGet(
7786
context,
7887
workingDirectory: '.',
@@ -82,21 +91,17 @@ void main() {
8291
String? workingDirectory,
8392
bool? runInShell,
8493
}) async {
85-
return result;
94+
return processResult;
8695
},
8796
exit: exitCalls.add,
8897
);
89-
expect(exitCalls, equals([code]));
98+
expect(exitCalls, equals([ExitCode.software.code]));
9099
verify(() => logger.err(error)).called(1);
91100
});
92101

93102
test('exits when ProcessException occurs', () async {
94103
const error = 'oops something went wrong';
95104
final exitCalls = <int>[];
96-
final result = _MockProcessResult();
97-
final code = ExitCode.software.code;
98-
when(() => result.exitCode).thenReturn(code);
99-
when(() => result.stderr).thenReturn(error);
100105
await dartPubGet(
101106
context,
102107
workingDirectory: '.',
@@ -106,11 +111,16 @@ void main() {
106111
String? workingDirectory,
107112
bool? runInShell,
108113
}) async {
109-
throw ProcessException('dart', ['pub', 'get'], error, code);
114+
throw ProcessException(
115+
'dart',
116+
['pub', 'get'],
117+
error,
118+
ExitCode.software.code,
119+
);
110120
},
111121
exit: exitCalls.add,
112122
);
113-
expect(exitCalls, equals([code]));
123+
expect(exitCalls, equals([ExitCode.software.code]));
114124
verify(() => logger.err(error)).called(1);
115125
});
116126
});

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:dart_frog_cli/src/commands/dev/templates/dart_frog_dev_server_bu
88
import 'package:dart_frog_cli/src/runtime_compatibility.dart'
99
as runtime_compatibility;
1010
import 'package:mason/mason.dart';
11+
import 'package:meta/meta.dart';
1112
import 'package:path/path.dart' as path;
1213
import 'package:stream_transform/stream_transform.dart';
1314
import 'package:watcher/watcher.dart';
@@ -62,7 +63,6 @@ class DevCommand extends DartFrogCommand {
6263
RestorableDirectoryGeneratorTargetBuilder? generatorTarget,
6364
Exit? exit,
6465
bool? isWindows,
65-
ProcessRun? runProcess,
6666
io.ProcessSignal? sigint,
6767
ProcessStart? startProcess,
6868
}) : _ensureRuntimeCompatibility = ensureRuntimeCompatibility ??
@@ -71,7 +71,6 @@ class DevCommand extends DartFrogCommand {
7171
_generator = generator ?? MasonGenerator.fromBundle,
7272
_exit = exit ?? io.exit,
7373
_isWindows = isWindows ?? io.Platform.isWindows,
74-
_runProcess = runProcess ?? io.Process.run,
7574
_sigint = sigint ?? io.ProcessSignal.sigint,
7675
_startProcess = startProcess ?? io.Process.start,
7776
_generatorTarget = generatorTarget ?? _defaultGeneratorTarget {
@@ -88,7 +87,13 @@ class DevCommand extends DartFrogCommand {
8887
final GeneratorBuilder _generator;
8988
final Exit _exit;
9089
final bool _isWindows;
91-
final ProcessRun _runProcess;
90+
91+
/// Function used to start a process used for testing purposes only.
92+
@visibleForTesting
93+
ProcessRun? testRunProcess;
94+
95+
ProcessRun get _runProcess => testRunProcess ?? io.Process.run;
96+
9297
final io.ProcessSignal _sigint;
9398
final ProcessStart _startProcess;
9499
final RestorableDirectoryGeneratorTargetBuilder _generatorTarget;

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

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ class _MockGeneratorHooks extends Mock implements GeneratorHooks {}
2323

2424
class _MockProcess extends Mock implements Process {}
2525

26-
class _MockProcessResult extends Mock implements ProcessResult {}
27-
2826
class _MockProcessSignal extends Mock implements ProcessSignal {}
2927

3028
class _MockProgress extends Mock implements Progress {}
@@ -43,14 +41,17 @@ void main() {
4341
registerFallbackValue(_FakeDirectoryGeneratorTarget());
4442
});
4543

44+
const processId = 42;
45+
final processResult = ProcessResult(processId, 0, '', '');
46+
4647
late ArgResults argResults;
4748
late DirectoryWatcher directoryWatcher;
4849
late MasonGenerator generator;
4950
late bool isWindows;
5051
late Progress progress;
5152
late Logger logger;
5253
late Process process;
53-
late ProcessResult processResult;
54+
5455
late ProcessSignal sigint;
5556
late RestorableDirectoryGeneratorTarget generatorTarget;
5657
late DevCommand command;
@@ -65,7 +66,6 @@ void main() {
6566
progress = _MockProgress();
6667
when(() => logger.progress(any())).thenReturn(progress);
6768
process = _MockProcess();
68-
processResult = _MockProcessResult();
6969
sigint = _MockProcessSignal();
7070
when(() => sigint.watch()).thenAnswer((_) => const Stream.empty());
7171
generatorTarget = _MockRestorableDirectoryGeneratorTarget();
@@ -76,9 +76,6 @@ void main() {
7676
generator: (_) async => generator,
7777
generatorTarget: (_) => generatorTarget,
7878
isWindows: isWindows,
79-
runProcess: (String executable, List<String> arguments) async {
80-
return processResult;
81-
},
8279
startProcess: (
8380
String executable,
8481
List<String> arguments, {
@@ -87,7 +84,9 @@ void main() {
8784
return process;
8885
},
8986
sigint: sigint,
90-
)..testArgResults = argResults;
87+
)
88+
..testArgResults = argResults
89+
..testRunProcess = (_, __) async => processResult;
9190
});
9291

9392
test('throws if ensureRuntimeCompatibility fails', () {
@@ -529,9 +528,9 @@ void main() {
529528
});
530529

531530
test('kills all child processes when sigint received on windows', () async {
532-
const processId = 42;
533531
final generatorHooks = _MockGeneratorHooks();
534532
final processRunCalls = <List<String>>[];
533+
535534
when(
536535
() => generatorHooks.preGen(
537536
vars: any(named: 'vars'),
@@ -565,10 +564,6 @@ void main() {
565564
generator: (_) async => generator,
566565
exit: (code) => exitCode = code,
567566
isWindows: true,
568-
runProcess: (String executable, List<String> arguments) async {
569-
processRunCalls.add([executable, ...arguments]);
570-
return processResult;
571-
},
572567
startProcess: (
573568
String executable,
574569
List<String> arguments, {
@@ -577,7 +572,12 @@ void main() {
577572
return process;
578573
},
579574
sigint: sigint,
580-
)..testArgResults = argResults;
575+
)
576+
..testArgResults = argResults
577+
..testRunProcess = (String executable, List<String> arguments) async {
578+
processRunCalls.add([executable, ...arguments]);
579+
return processResult;
580+
};
581581
command.run().ignore();
582582
await untilCalled(() => process.pid);
583583
expect(
@@ -592,7 +592,6 @@ void main() {
592592
test(
593593
'kills process if error occurs before '
594594
'hotreload is enabled on windows', () async {
595-
const processId = 42;
596595
final generatorHooks = _MockGeneratorHooks();
597596
final processRunCalls = <List<String>>[];
598597
int? exitCode;
@@ -620,7 +619,6 @@ void main() {
620619
(_) => Stream.value(utf8.encode('oops')),
621620
);
622621
when(() => process.pid).thenReturn(processId);
623-
when(() => processResult.exitCode).thenReturn(ExitCode.success.code);
624622
when(
625623
() => directoryWatcher.events,
626624
).thenAnswer((_) => StreamController<WatchEvent>().stream);
@@ -632,10 +630,6 @@ void main() {
632630
generator: (_) async => generator,
633631
exit: (code) => exitCode = code,
634632
isWindows: true,
635-
runProcess: (String executable, List<String> arguments) async {
636-
processRunCalls.add([executable, ...arguments]);
637-
return processResult;
638-
},
639633
startProcess: (
640634
String executable,
641635
List<String> arguments, {
@@ -644,7 +638,12 @@ void main() {
644638
return process;
645639
},
646640
sigint: sigint,
647-
)..testArgResults = argResults;
641+
)
642+
..testArgResults = argResults
643+
..testRunProcess = (String executable, List<String> arguments) async {
644+
processRunCalls.add([executable, ...arguments]);
645+
return processResult;
646+
};
648647
command.run().ignore();
649648
await untilCalled(() => process.pid);
650649
expect(exitCode, equals(1));
@@ -764,10 +763,6 @@ lib/my_model.g.dart:53:20: Warning: Operand of null-aware operation '!' has type
764763
directoryWatcher: (_) => directoryWatcher,
765764
generator: (_) async => generator,
766765
exit: (code) => exitCode = code,
767-
runProcess: (String executable, List<String> arguments) async {
768-
processRunCalls.add([executable, ...arguments]);
769-
return processResult;
770-
},
771766
startProcess: (
772767
String executable,
773768
List<String> arguments, {
@@ -776,7 +771,12 @@ lib/my_model.g.dart:53:20: Warning: Operand of null-aware operation '!' has type
776771
return process;
777772
},
778773
sigint: sigint,
779-
)..testArgResults = argResults;
774+
)
775+
..testArgResults = argResults
776+
..testRunProcess = (String executable, List<String> arguments) async {
777+
processRunCalls.add([executable, ...arguments]);
778+
return processResult;
779+
};
780780
command.run().ignore();
781781
await untilCalled(() => process.kill());
782782
expect(exitCode, equals(1));

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,22 @@ class MockLogger extends Mock implements Logger {}
1212

1313
class MockPubUpdater extends Mock implements PubUpdater {}
1414

15-
class MockProcessResult extends Mock implements ProcessResult {}
16-
1715
class MockProgress extends Mock implements Progress {}
1816

1917
void main() {
2018
const latestVersion = '0.0.0';
2119

2220
group('dart_frog update', () {
21+
const processId = 42;
22+
final processResult = ProcessResult(processId, 0, '', '');
23+
2324
late Logger logger;
2425
late PubUpdater pubUpdater;
2526
late UpdateCommand command;
26-
late ProcessResult processResult;
2727

2828
setUp(() {
2929
logger = MockLogger();
3030
pubUpdater = MockPubUpdater();
31-
processResult = MockProcessResult();
3231

3332
when(() => logger.progress(any())).thenReturn(MockProgress());
3433
when(
@@ -84,8 +83,9 @@ void main() {
8483

8584
test('handles pub update process errors', () async {
8685
const error = 'Oh no! Installing this is not possible right now!';
87-
when(() => processResult.exitCode).thenReturn(1);
88-
when<dynamic>(() => processResult.stderr).thenReturn(error);
86+
87+
final processResult = ProcessResult(processId, 1, '', error);
88+
8989
when(
9090
() => pubUpdater.getLatestVersion(any()),
9191
).thenAnswer((_) async => latestVersion);
@@ -118,7 +118,7 @@ void main() {
118118
versionConstraint: any(named: 'versionConstraint'),
119119
),
120120
).thenAnswer((_) => Future.value(processResult));
121-
when(() => processResult.exitCode).thenReturn(0);
121+
122122
when(() => logger.progress(any())).thenReturn(MockProgress());
123123
final result = await command.run();
124124
expect(result, equals(ExitCode.success.code));

0 commit comments

Comments
 (0)