From 1198b5c37ecf0b1cbd7c34a73ed1fcb99384f53f Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 26 Mar 2021 14:02:50 -0700 Subject: [PATCH 1/2] Add tests for publish check tool command --- .../tool/lib/src/publish_check_command.dart | 4 +- .../tool/test/publish_check_command_test.dart | 115 ++++++++++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 script/tool/test/publish_check_command_test.dart diff --git a/script/tool/lib/src/publish_check_command.dart b/script/tool/lib/src/publish_check_command.dart index dcd28d9a89f3..fb57dfcd6dc9 100644 --- a/script/tool/lib/src/publish_check_command.dart +++ b/script/tool/lib/src/publish_check_command.dart @@ -65,10 +65,10 @@ class PublishCheckCommand extends PluginCommand { } Future hasValidPublishCheckRun(Directory package) async { - final io.Process process = await io.Process.start( + final io.Process process = await processRunner.start( 'flutter', ['pub', 'publish', '--', '--dry-run'], - workingDirectory: package.path, + workingDirectory: package, ); final StringBuffer outputBuffer = StringBuffer(); diff --git a/script/tool/test/publish_check_command_test.dart b/script/tool/test/publish_check_command_test.dart new file mode 100644 index 000000000000..4f14e7ff738f --- /dev/null +++ b/script/tool/test/publish_check_command_test.dart @@ -0,0 +1,115 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:collection'; +import 'dart:io' as io; + +import 'package:args/command_runner.dart'; +import 'package:file/file.dart'; +import 'package:flutter_plugin_tools/src/analyze_command.dart'; +import 'package:flutter_plugin_tools/src/common.dart'; +import 'package:flutter_plugin_tools/src/publish_check_command.dart'; +import 'package:test/test.dart'; + +import 'mocks.dart'; +import 'util.dart'; + +void main() { + group('$PublishCheckProcessRunner tests', () { + PublishCheckProcessRunner processRunner; + CommandRunner runner; + + setUp(() { + initializeFakePackages(); + processRunner = PublishCheckProcessRunner(); + final PublishCheckCommand publishCheckCommand = PublishCheckCommand( + mockPackagesDir, mockFileSystem, + processRunner: processRunner); + + runner = CommandRunner( + 'publish_check_command', + 'Test for publish-check command.', + ); + runner.addCommand(publishCheckCommand); + }); + + tearDown(() { + mockPackagesDir.deleteSync(recursive: true); + }); + + test('publish check all packages', () async { + final Directory plugin1Dir = await createFakePlugin('a'); + final Directory plugin2Dir = await createFakePlugin('b'); + + processRunner.processesToReturn.add( + MockProcess()..exitCodeCompleter.complete(0), + ); + processRunner.processesToReturn.add( + MockProcess()..exitCodeCompleter.complete(0), + ); + await runner.run(['publish-check']); + + expect( + processRunner.recordedCalls, + orderedEquals([ + ProcessCall('flutter', + ['pub', 'publish', '--', '--dry-run'], plugin1Dir.path), + ProcessCall('flutter', + ['pub', 'publish', '--', '--dry-run'], plugin2Dir.path), + ])); + }); + + test('fail on negative test', () async { + await createFakePlugin('a'); + + final MockProcess process = MockProcess(); + process.stdoutController.close(); // ignore: unawaited_futures + process.stderrController.close(); // ignore: unawaited_futures + process.exitCodeCompleter.complete(1); + + processRunner.processesToReturn.add(process); + + expect( + () => runner.run(['publish-check']), + throwsA(isA()), + ); + }); + + test('fail on bad pubspec', () async { + final Directory dir = await createFakePlugin('c'); + await dir.childFile('pubspec.yaml').writeAsString('bad-yaml'); + + final MockProcess process = MockProcess(); + processRunner.processesToReturn.add(process); + + expect(() => runner.run(['publish-check']), + throwsA(isA())); + }); + + test('pass on prerelease', () async { + await createFakePlugin('d'); + + final String preReleaseOutput = 'Package has 1 warning.' + 'Packages with an SDK constraint on a pre-release of the Dart SDK should themselves be published as a pre-release version.'; + + final MockProcess process = MockProcess(); + process.stdoutController.add(preReleaseOutput.codeUnits); + process.stdoutController.close(); // ignore: unawaited_futures + process.stderrController.close(); // ignore: unawaited_futures + + process.exitCodeCompleter.complete(1); + + processRunner.processesToReturn.add(process); + + expect(runner.run(['publish-check']), completes); + }); + }); +} + +class PublishCheckProcessRunner extends RecordingProcessRunner { + Queue processesToReturn = Queue(); + + @override + io.Process get processToReturn => processesToReturn.removeFirst(); +} From 4f18f8402a489d5e2dfc4cfd038718c1e281c8b4 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Sat, 27 Mar 2021 15:08:10 -0700 Subject: [PATCH 2/2] removed unused import and use final --- script/tool/test/publish_check_command_test.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/script/tool/test/publish_check_command_test.dart b/script/tool/test/publish_check_command_test.dart index 4f14e7ff738f..dbe6e2cfe548 100644 --- a/script/tool/test/publish_check_command_test.dart +++ b/script/tool/test/publish_check_command_test.dart @@ -7,7 +7,6 @@ import 'dart:io' as io; import 'package:args/command_runner.dart'; import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/analyze_command.dart'; import 'package:flutter_plugin_tools/src/common.dart'; import 'package:flutter_plugin_tools/src/publish_check_command.dart'; import 'package:test/test.dart'; @@ -108,7 +107,7 @@ void main() { } class PublishCheckProcessRunner extends RecordingProcessRunner { - Queue processesToReturn = Queue(); + final Queue processesToReturn = Queue(); @override io.Process get processToReturn => processesToReturn.removeFirst();