Skip to content

[tools] Add mockito support to update-dependency #4260

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

Merged
merged 2 commits into from
Jun 21, 2023
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
43 changes: 42 additions & 1 deletion script/tool/lib/src/update_dependency_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,13 @@ ${response.httpResponse.body}
if (!await _regeneratePigeonFiles(package)) {
return PackageResult.fail(<String>['Failed to update pigeon files']);
}
} else if (dependency == 'mockito') {
if (!await _regenerateMocks(package)) {
return PackageResult.fail(<String>['Failed to update mocks']);
}
}
// TODO(stuartmorgan): Add additional handling of known packages that
// do file generation (mockito, etc.).
// do file generation.

return PackageResult.success();
}
Expand Down Expand Up @@ -258,6 +262,43 @@ ${response.httpResponse.body}
}
return true;
}

/// Re-runs Mockito mock generation for [package] if necessary.
Future<bool> _regenerateMocks(RepositoryPackage package) async {
final Pubspec pubspec = package.parsePubspec();
if (!pubspec.devDependencies.keys.contains('build_runner')) {
print(
'${indentation}No build_runner dependency; skipping mock regeneration.');
return true;
}

print('${indentation}Running pub get...');
final io.ProcessResult getResult = await processRunner
.run('dart', <String>['pub', 'get'], workingDir: package.directory);
if (getResult.exitCode != 0) {
printError('dart pub get failed (${getResult.exitCode}):\n'
'${getResult.stdout}\n${getResult.stderr}\n');
return false;
}

print('${indentation}Updating mocks...');
final io.ProcessResult buildRunnerResult = await processRunner.run(
'dart',
<String>[
'run',
'build_runner',
'build',
'--delete-conflicting-outputs'
],
workingDir: package.directory);
if (buildRunnerResult.exitCode != 0) {
printError(
'"dart run build_runner build" failed (${buildRunnerResult.exitCode}):\n'
'${buildRunnerResult.stdout}\n${buildRunnerResult.stderr}\n');
return false;
}
return true;
}
}

class _PubDependencyInfo {
Expand Down
117 changes: 117 additions & 0 deletions script/tool/test/update_dependency_command_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -466,5 +466,122 @@ dev_dependencies:
]),
);
});

test('regenerates mocks when updating mockito if necessary', () async {
final RepositoryPackage package =
createFakePackage('a_package', packagesDir);
addDependency(package, 'mockito', version: '1.0.0');
addDevDependency(package, 'build_runner');

await runCapturingPrint(runner, <String>[
'update-dependency',
'--pub-package',
'mockito',
'--version',
'1.5.0',
]);

expect(
processRunner.recordedCalls,
orderedEquals(<ProcessCall>[
ProcessCall(
'dart',
const <String>['pub', 'get'],
package.path,
),
ProcessCall(
'dart',
const <String>[
'run',
'build_runner',
'build',
'--delete-conflicting-outputs'
],
package.path,
),
]),
);
});

test('skips regenerating mocks when there is no build_runner dependency',
() async {
final RepositoryPackage package =
createFakePackage('a_package', packagesDir);
addDependency(package, 'mockito', version: '1.0.0');

await runCapturingPrint(runner, <String>[
'update-dependency',
'--pub-package',
'mockito',
'--version',
'1.5.0',
]);

expect(processRunner.recordedCalls.isEmpty, true);
});

test('updating mockito fails if pub get fails', () async {
final RepositoryPackage package =
createFakePackage('a_package', packagesDir);
addDependency(package, 'mockito', version: '1.0.0');
addDevDependency(package, 'build_runner');

processRunner.mockProcessesForExecutable['dart'] = <FakeProcessInfo>[
FakeProcessInfo(MockProcess(exitCode: 1), <String>['pub', 'get'])
];

Error? commandError;
final List<String> output = await runCapturingPrint(runner, <String>[
'update-dependency',
'--pub-package',
'mockito',
'--version',
'1.5.0',
], errorHandler: (Error e) {
commandError = e;
});

expect(commandError, isA<ToolExit>());
expect(
output,
containsAllInOrder(<Matcher>[
contains('dart pub get failed'),
contains('Failed to update mocks'),
]),
);
});

test('updating mockito fails if running build_runner fails', () async {
final RepositoryPackage package =
createFakePackage('a_package', packagesDir);
addDependency(package, 'mockito', version: '1.0.0');
addDevDependency(package, 'build_runner');

processRunner.mockProcessesForExecutable['dart'] = <FakeProcessInfo>[
FakeProcessInfo(MockProcess(), <String>['pub', 'get']),
FakeProcessInfo(
MockProcess(exitCode: 1), <String>['run', 'build_runner']),
];

Error? commandError;
final List<String> output = await runCapturingPrint(runner, <String>[
'update-dependency',
'--pub-package',
'mockito',
'--version',
'1.5.0',
], errorHandler: (Error e) {
commandError = e;
});

expect(commandError, isA<ToolExit>());
expect(
output,
containsAllInOrder(<Matcher>[
contains('"dart run build_runner build" failed'),
contains('Failed to update mocks'),
]),
);
});
});
}