Warn first time a package version opts in to null-safety (#2465)
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index 0f361af..d2a710b 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -158,9 +158,12 @@
/// Validates the package. Completes to false if the upload should not
/// proceed.
Future<bool> _validate(Future<int> packageSize) async {
- var pair = await Validator.runAll(entrypoint, packageSize);
- var errors = pair.first;
- var warnings = pair.last;
+ final hints = <String>[];
+ final warnings = <String>[];
+ final errors = <String>[];
+
+ await Validator.runAll(entrypoint, packageSize, server.toString(),
+ hints: hints, warnings: warnings, errors: errors);
if (errors.isNotEmpty) {
log.error('Sorry, your package is missing '
@@ -172,9 +175,15 @@
if (force) return true;
+ String formatWarningCount() {
+ final hs = hints.length == 1 ? '' : 's';
+ final hintText = hints.isEmpty ? '' : ' and ${hints.length} hint$hs.';
+ final ws = warnings.length == 1 ? '' : 's';
+ return '\nPackage has ${warnings.length} warning$ws$hintText.';
+ }
+
if (dryRun) {
- var s = warnings.length == 1 ? '' : 's';
- log.warning('\nPackage has ${warnings.length} warning$s.');
+ log.warning(formatWarningCount());
return warnings.isEmpty;
}
@@ -183,12 +192,9 @@
final package = entrypoint.root;
var message = 'Do you want to publish ${package.name} ${package.version}';
- if (warnings.isNotEmpty) {
- final s = warnings.length == 1 ? '' : 's';
- final warning = log.bold(log.red(
- 'Package has ${warnings.length} warning$s',
- ));
- message = '$warning. $message';
+ if (warnings.isNotEmpty || hints.isNotEmpty) {
+ final warning = formatWarningCount();
+ message = '${log.bold(log.red(warning))}. $message';
}
var confirmed = await confirm('\n$message');
diff --git a/lib/src/validator.dart b/lib/src/validator.dart
index 51fa569..2a3ef89 100644
--- a/lib/src/validator.dart
+++ b/lib/src/validator.dart
@@ -10,7 +10,6 @@
import 'entrypoint.dart';
import 'log.dart' as log;
import 'sdk.dart';
-import 'utils.dart';
import 'validator/changelog.dart';
import 'validator/compiled_dartdoc.dart';
import 'validator/dependency.dart';
@@ -25,6 +24,7 @@
import 'validator/pubspec.dart';
import 'validator/pubspec_field.dart';
import 'validator/readme.dart';
+import 'validator/relative_version_numbering.dart';
import 'validator/sdk_constraint.dart';
import 'validator/size.dart';
import 'validator/strict_dependencies.dart';
@@ -50,6 +50,11 @@
/// Filled by calling [validate].
final warnings = <String>[];
+ /// The accumulated hints for this validator.
+ ///
+ /// Filled by calling [validate].
+ final hints = <String>[];
+
Validator(this.entrypoint);
/// Validates the entrypoint, adding any errors and warnings to [errors] and
@@ -104,13 +109,15 @@
/// Run all validators on the [entrypoint] package and print their results.
///
- /// The future completes with the error and warning messages, respectively.
+ /// When the future completes [hints] [warnings] amd [errors] will have been
+ /// appended with the reported hints warnings and errors respectively.
///
/// [packageSize], if passed, should complete to the size of the tarred
/// package, in bytes. This is used to validate that it's not too big to
/// upload to the server.
- static Future<Pair<List<String>, List<String>>> runAll(Entrypoint entrypoint,
- [Future<int> packageSize]) {
+ static Future<void> runAll(
+ Entrypoint entrypoint, Future<int> packageSize, String serverUrl,
+ {List<String> hints, List<String> warnings, List<String> errors}) {
var validators = [
PubspecValidator(entrypoint),
LicenseValidator(entrypoint),
@@ -128,6 +135,7 @@
StrictDependenciesValidator(entrypoint),
FlutterPluginFormatValidator(entrypoint),
LanguageVersionValidator(entrypoint),
+ RelativeVersionNumberingValidator(entrypoint, serverUrl),
];
if (packageSize != null) {
validators.add(SizeValidator(entrypoint, packageSize));
@@ -135,9 +143,10 @@
return Future.wait(validators.map((validator) => validator.validate()))
.then((_) {
- var errors = validators.expand((validator) => validator.errors).toList();
- var warnings =
- validators.expand((validator) => validator.warnings).toList();
+ hints.addAll([for (final validator in validators) ...validator.hints]);
+ warnings
+ .addAll([for (final validator in validators) ...validator.warnings]);
+ errors.addAll([for (final validator in validators) ...validator.errors]);
if (errors.isNotEmpty) {
final s = errors.length > 1 ? 's' : '';
@@ -158,8 +167,6 @@
}
log.warning('');
}
-
- return Pair<List<String>, List<String>>(errors, warnings);
});
}
}
diff --git a/lib/src/validator/relative_version_numbering.dart b/lib/src/validator/relative_version_numbering.dart
new file mode 100644
index 0000000..5e227fc
--- /dev/null
+++ b/lib/src/validator/relative_version_numbering.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. 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:async';
+
+import 'package:pub_semver/pub_semver.dart';
+
+import '../entrypoint.dart';
+import '../exceptions.dart';
+import '../package_name.dart';
+import '../pubspec.dart';
+import '../validator.dart';
+
+/// Gives a warning when publishing a new version, if the latest published
+/// version lower to this was not opted into null-safety.
+class RelativeVersionNumberingValidator extends Validator {
+ static const String guideUrl = 'https://dart.dev/null-safety/migration-guide';
+ static const String semverUrl =
+ 'https://dart.dev/tools/pub/versioning#semantic-versions';
+
+ final String _server;
+
+ RelativeVersionNumberingValidator(Entrypoint entrypoint, this._server)
+ : super(entrypoint);
+
+ @override
+ Future<void> validate() async {
+ final hostedSource = entrypoint.cache.sources.hosted;
+ List<PackageId> existingVersions;
+ try {
+ existingVersions = await hostedSource
+ .bind(entrypoint.cache)
+ .getVersions(hostedSource.refFor(entrypoint.root.name, url: _server));
+ } on PackageNotFoundException {
+ existingVersions = [];
+ }
+ existingVersions..sort((a, b) => a.version.compareTo(b.version));
+ final previousVersion = existingVersions.lastWhere(
+ (id) =>
+ !id.version.isPreRelease && id.version < entrypoint.root.version,
+ orElse: () => null);
+ if (previousVersion == null) return;
+
+ final previousPubspec =
+ await hostedSource.bind(entrypoint.cache).describe(previousVersion);
+
+ final currentOptedIn = _optedIntoNullSafety(entrypoint.root.pubspec);
+ final previousOptedIn = _optedIntoNullSafety(previousPubspec);
+
+ if (currentOptedIn && !previousOptedIn) {
+ hints.add(
+ 'You\'re about to publish a package that opts into null safety.\n'
+ 'The previous version (${previousVersion.version}) isn\'t opted in.\n'
+ 'See $guideUrl for best practices.');
+ } else if (!currentOptedIn && previousOptedIn) {
+ hints.add(
+ 'You\'re about to publish a package that doesn\'t opt into null safety,\n'
+ 'but the previous version (${previousVersion.version}) was opted in.\n'
+ 'This change is likely to be backwards incompatible.\n'
+ 'See $semverUrl for information about versioning.');
+ }
+ }
+
+ static bool _optedIntoNullSafety(Pubspec pubspec) {
+ final sdkConstraint = pubspec.originalDartSdkConstraint;
+
+ /// If the sdk constraint is not a `VersionRange` something is wrong, and
+ /// we cannot deduce the language version.
+ ///
+ /// This will hopefully be detected elsewhere.
+ ///
+ /// A single `Version` is also a `VersionRange`.
+ if (sdkConstraint is! VersionRange) return false;
+ final constraintMin = (sdkConstraint as VersionRange).min;
+
+ if (constraintMin == null) return false;
+
+ final languageVersion =
+ Version(constraintMin.major, constraintMin.minor, 0);
+
+ return languageVersion >= _firstVersionSupportingNullSafety;
+ }
+
+ static final _firstVersionSupportingNullSafety = Version.parse('2.10.0');
+}
diff --git a/test/descriptor.dart b/test/descriptor.dart
index 69427eb..ce65803 100644
--- a/test/descriptor.dart
+++ b/test/descriptor.dart
@@ -6,7 +6,6 @@
import 'package:oauth2/oauth2.dart' as oauth2;
import 'package:pub/src/io.dart';
import 'package:pub/src/package_config.dart';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test_descriptor/test_descriptor.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
@@ -141,14 +140,14 @@
/// Describes the file in the system cache that contains the client's OAuth2
/// credentials. The URL "/token" on [server] will be used as the token
/// endpoint for refreshing the access token.
-Descriptor credentialsFile(ShelfTestServer server, String accessToken,
+Descriptor credentialsFile(PackageServer server, String accessToken,
{String refreshToken, DateTime expiration}) {
return dir(cachePath, [
file(
'credentials.json',
oauth2.Credentials(accessToken,
refreshToken: refreshToken,
- tokenEndpoint: server.url.resolve('/token'),
+ tokenEndpoint: Uri.parse(server.url).resolve('/token'),
scopes: [
'openid',
'https://www.googleapis.com/auth/userinfo.email',
diff --git a/test/descriptor_server.dart b/test/descriptor_server.dart
index d14dbed..fdfa67a 100644
--- a/test/descriptor_server.dart
+++ b/test/descriptor_server.dart
@@ -37,7 +37,7 @@
/// This server will exist only for the duration of the pub run. It's accessible
/// via [server]. Subsequent calls to [serve] replace the previous server.
Future serve([List<d.Descriptor> contents]) async {
- globalServer = await DescriptorServer.start(contents);
+ globalServer = (await DescriptorServer.start())..contents.addAll(contents);
}
/// Like [serve], but reports an error if a request ever comes in to the server.
@@ -63,21 +63,33 @@
/// This can safely be modified between requests.
List<d.Descriptor> get contents => _baseDir.contents;
+ /// Handlers for requests not easily described as files.
+ final Map<Pattern, shelf.Handler> extraHandlers = {};
+
/// Creates an HTTP server to serve [contents] as static files.
///
/// This server exists only for the duration of the pub run. Subsequent calls
/// to [serve] replace the previous server.
- static Future<DescriptorServer> start([List<d.Descriptor> contents]) async =>
- DescriptorServer._(
- await shelf_io.IOServer.bind('localhost', 0), contents);
+ static Future<DescriptorServer> start() async =>
+ DescriptorServer._(await shelf_io.IOServer.bind('localhost', 0));
/// Creates a server that reports an error if a request is ever received.
static Future<DescriptorServer> errors() async =>
- DescriptorServer._errors(await shelf_io.IOServer.bind('localhost', 0));
+ DescriptorServer._(await shelf_io.IOServer.bind('localhost', 0))
+ ..extraHandlers[RegExp('.*')] = (request) {
+ fail('The HTTP server received an unexpected request:\n'
+ '${request.method} ${request.requestedUri}');
+ };
- DescriptorServer._(this._server, Iterable<d.Descriptor> contents)
- : _baseDir = d.dir('serve-dir', contents) {
+ DescriptorServer._(this._server) : _baseDir = d.dir('serve-dir', []) {
_server.mount((request) async {
+ final pathWithInitialSlash = '/${request.url.path}';
+ final key = extraHandlers.keys.firstWhere((pattern) {
+ final match = pattern.matchAsPrefix(pathWithInitialSlash);
+ return match != null && match.end == pathWithInitialSlash.length;
+ }, orElse: () => null);
+ if (key != null) return extraHandlers[key](request);
+
var path = p.posix.fromUri(request.url.path);
requestedPaths.add(path);
@@ -91,14 +103,6 @@
addTearDown(_server.close);
}
- DescriptorServer._errors(this._server) : _baseDir = d.dir('serve-dir', []) {
- _server.mount((request) {
- fail('The HTTP server received an unexpected request:\n'
- '${request.method} ${request.requestedUri}');
- });
- addTearDown(_server.close);
- }
-
/// Closes this server.
Future close() => _server.close();
}
diff --git a/test/hosted/version_negotiation_test.dart b/test/hosted/version_negotiation_test.dart
index 6d06729..bed8e2d 100644
--- a/test/hosted/version_negotiation_test.dart
+++ b/test/hosted/version_negotiation_test.dart
@@ -2,8 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -12,38 +12,37 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('sends the correct Accept header', () async {
- var server = await ShelfTestServer.create();
+ await servePackages();
await d.appDir({
'foo': {
- 'hosted': {'name': 'foo', 'url': server.url.toString()}
+ 'hosted': {'name': 'foo', 'url': globalPackageServer.url}
}
}).create();
- var pub = await startPub(args: [command.name]);
-
- server.handler.expect('GET', '/api/packages/foo', (request) {
+ globalPackageServer.expect('GET', '/api/packages/foo', (request) {
expect(
request.headers['accept'], equals('application/vnd.pub.v2+json'));
- return shelf.Response(200);
+ return shelf.Response(404);
});
- await pub.kill();
+ await pubCommand(command,
+ output: anything, exitCode: exit_codes.UNAVAILABLE);
});
test('prints a friendly error if the version is out-of-date', () async {
- var server = await ShelfTestServer.create();
+ await servePackages();
await d.appDir({
'foo': {
- 'hosted': {'name': 'foo', 'url': server.url.toString()}
+ 'hosted': {'name': 'foo', 'url': globalPackageServer.url}
}
}).create();
var pub = await startPub(args: [command.name]);
- server.handler
- .expect('GET', '/api/packages/foo', (request) => shelf.Response(406));
+ globalPackageServer.expect(
+ 'GET', '/api/packages/foo', (request) => shelf.Response(406));
await pub.shouldExit(1);
diff --git a/test/lish/archives_and_uploads_a_package_test.dart b/test/lish/archives_and_uploads_a_package_test.dart
index 8a57716..4c9e114 100644
--- a/test/lish/archives_and_uploads_a_package_test.dart
+++ b/test/lish/archives_and_uploads_a_package_test.dart
@@ -6,7 +6,6 @@
import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -20,15 +19,15 @@
setUp(d.validPackage.create);
test('archives and uploads a package', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
@@ -54,15 +53,15 @@
deleteEntry(p.join(d.sandbox, appPath, 'empty'));
await d.dir(p.join(appPath, 'empty')).create();
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/cloud_storage_upload_doesnt_redirect_test.dart b/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
index 14fc05f..242b2a9 100644
--- a/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
+++ b/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -14,14 +13,14 @@
setUp(d.validPackage.create);
test("cloud storage upload doesn't redirect", () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
+ handleUploadForm(globalPackageServer);
- server.handler.expect('POST', '/upload', (request) async {
+ globalPackageServer.expect('POST', '/upload', (request) async {
await request.read().drain();
return shelf.Response(200);
});
diff --git a/test/lish/cloud_storage_upload_provides_an_error_test.dart b/test/lish/cloud_storage_upload_provides_an_error_test.dart
index aa1956f..048f10a 100644
--- a/test/lish/cloud_storage_upload_provides_an_error_test.dart
+++ b/test/lish/cloud_storage_upload_provides_an_error_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -14,14 +13,14 @@
setUp(d.validPackage.create);
test('cloud storage upload provides an error', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
+ handleUploadForm(globalPackageServer);
- server.handler.expect('POST', '/upload', (request) {
+ globalPackageServer.expect('POST', '/upload', (request) {
return request.read().drain().then((_) {
return shelf.Response.notFound(
'<Error><Message>Your request sucked.</Message></Error>',
diff --git a/test/lish/force_does_not_publish_if_there_are_errors_test.dart b/test/lish/force_does_not_publish_if_there_are_errors_test.dart
index 098c40a..0e95efe 100644
--- a/test/lish/force_does_not_publish_if_there_are_errors_test.dart
+++ b/test/lish/force_does_not_publish_if_there_are_errors_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -18,8 +17,8 @@
pkg.remove('description');
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- var pub = await startPublish(server, args: ['--force']);
+ await servePackages();
+ var pub = await startPublish(globalPackageServer, args: ['--force']);
await pub.shouldExit(exit_codes.DATA);
expect(
diff --git a/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart b/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
index b39e8ec..256cf58 100644
--- a/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
+++ b/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -18,14 +17,14 @@
setUp(d.validPackage.create);
test('--force publishes if there are no warnings or errors', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server, args: ['--force']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer, args: ['--force']);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/force_publishes_if_there_are_warnings_test.dart b/test/lish/force_publishes_if_there_are_warnings_test.dart
index 23b7996..9bd0c01 100644
--- a/test/lish/force_publishes_if_there_are_warnings_test.dart
+++ b/test/lish/force_publishes_if_there_are_warnings_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -23,14 +22,14 @@
pkg['dependencies'] = {'foo': 'any'};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server, args: ['--force']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer, args: ['--force']);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/many_files_test.dart b/test/lish/many_files_test.dart
index 7ef9d2c..d20e433 100644
--- a/test/lish/many_files_test.dart
+++ b/test/lish/many_files_test.dart
@@ -8,7 +8,6 @@
import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -75,15 +74,15 @@
File(p.join(appRoot, fileName)).writeAsStringSync('');
}
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/package_creation_provides_a_malformed_error_test.dart b/test/lish/package_creation_provides_a_malformed_error_test.dart
index a4b601d..c1fc105 100644
--- a/test/lish/package_creation_provides_a_malformed_error_test.dart
+++ b/test/lish/package_creation_provides_a_malformed_error_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,16 +15,16 @@
setUp(d.validPackage.create);
test('package creation provides a malformed error', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
var body = {'error': 'Your package was too boring.'};
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.notFound(jsonEncode(body));
});
diff --git a/test/lish/package_creation_provides_a_malformed_success_test.dart b/test/lish/package_creation_provides_a_malformed_success_test.dart
index 27415b8..997a61f 100644
--- a/test/lish/package_creation_provides_a_malformed_success_test.dart
+++ b/test/lish/package_creation_provides_a_malformed_success_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,16 +15,16 @@
setUp(d.validPackage.create);
test('package creation provides a malformed success', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
var body = {'success': 'Your package was awesome.'};
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode(body));
});
diff --git a/test/lish/package_creation_provides_an_error_test.dart b/test/lish/package_creation_provides_an_error_test.dart
index 39f41af..a4c5fd4 100644
--- a/test/lish/package_creation_provides_an_error_test.dart
+++ b/test/lish/package_creation_provides_an_error_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,15 +15,15 @@
setUp(d.validPackage.create);
test('package creation provides an error', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.notFound(jsonEncode({
'error': {'message': 'Your package was too boring.'}
}));
diff --git a/test/lish/package_creation_provides_invalid_json_test.dart b/test/lish/package_creation_provides_invalid_json_test.dart
index 2666b95..9d845c4 100644
--- a/test/lish/package_creation_provides_invalid_json_test.dart
+++ b/test/lish/package_creation_provides_invalid_json_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -14,15 +13,15 @@
setUp(d.validPackage.create);
test('package creation provides invalid JSON', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok('{not json');
});
diff --git a/test/lish/package_validation_has_a_warning_and_continues_test.dart b/test/lish/package_validation_has_a_warning_and_continues_test.dart
index b672126..aec98b7 100644
--- a/test/lish/package_validation_has_a_warning_and_continues_test.dart
+++ b/test/lish/package_validation_has_a_warning_and_continues_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -23,14 +22,14 @@
pkg['author'] = 'Natalie Weizenbaum';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
pub.stdin.writeln('y');
- handleUploadForm(server);
- handleUpload(server);
+ handleUploadForm(globalPackageServer);
+ handleUpload(globalPackageServer);
- server.handler.expect('GET', '/create', (request) {
+ globalPackageServer.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart b/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
index fa67de6..19c5d2a 100644
--- a/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
+++ b/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -19,8 +18,8 @@
pkg['author'] = 'Natalie Weizenbaum';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- var pub = await startPublish(server);
+ await servePackages();
+ var pub = await startPublish(globalPackageServer);
pub.stdin.writeln('n');
await pub.shouldExit(exit_codes.DATA);
diff --git a/test/lish/package_validation_has_an_error_test.dart b/test/lish/package_validation_has_an_error_test.dart
index a23bf3c..8c22290 100644
--- a/test/lish/package_validation_has_an_error_test.dart
+++ b/test/lish/package_validation_has_an_error_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -18,8 +17,8 @@
pkg.remove('description');
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- var pub = await startPublish(server);
+ await servePackages();
+ var pub = await startPublish(globalPackageServer);
await pub.shouldExit(exit_codes.DATA);
expect(
diff --git a/test/lish/preview_package_validation_has_a_warning_test.dart b/test/lish/preview_package_validation_has_a_warning_test.dart
index 43e3272..7581aa0 100644
--- a/test/lish/preview_package_validation_has_a_warning_test.dart
+++ b/test/lish/preview_package_validation_has_a_warning_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -19,8 +18,8 @@
pkg['dependencies'] = {'foo': 'any'};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- var pub = await startPublish(server, args: ['--dry-run']);
+ await servePackages();
+ var pub = await startPublish(globalPackageServer, args: ['--dry-run']);
await pub.shouldExit(exit_codes.DATA);
expect(
diff --git a/test/lish/preview_package_validation_has_no_warnings_test.dart b/test/lish/preview_package_validation_has_no_warnings_test.dart
index 5a39ddb..83ef097 100644
--- a/test/lish/preview_package_validation_has_no_warnings_test.dart
+++ b/test/lish/preview_package_validation_has_no_warnings_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
@@ -18,8 +17,8 @@
packageMap('test_pkg', '1.0.0', null, null, {'sdk': '>=1.8.0 <2.0.0'});
await d.dir(appPath, [d.pubspec(pkg)]).create();
- var server = await ShelfTestServer.create();
- var pub = await startPublish(server, args: ['--dry-run']);
+ await servePackages((_) {});
+ var pub = await startPublish(globalPackageServer, args: ['--dry-run']);
await pub.shouldExit(exit_codes.SUCCESS);
expect(pub.stderr, emitsThrough('Package has 0 warnings.'));
diff --git a/test/lish/upload_form_fields_has_a_non_string_value_test.dart b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
index 86c37d2..d26ac3e 100644
--- a/test/lish/upload_form_fields_has_a_non_string_value_test.dart
+++ b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
@@ -4,7 +4,6 @@
import 'dart:convert';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -15,9 +14,9 @@
setUp(d.validPackage.create);
test('upload form fields has a non-string value', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages((_) {});
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
@@ -25,7 +24,7 @@
'url': 'http://example.com/upload',
'fields': {'field': 12}
};
- handleUploadForm(server, body);
+ handleUploadForm(globalPackageServer, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_fields_is_not_a_map_test.dart b/test/lish/upload_form_fields_is_not_a_map_test.dart
index 081cbdc..c21183a 100644
--- a/test/lish/upload_form_fields_is_not_a_map_test.dart
+++ b/test/lish/upload_form_fields_is_not_a_map_test.dart
@@ -4,7 +4,6 @@
import 'dart:convert';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -15,14 +14,14 @@
setUp(d.validPackage.create);
test('upload form fields is not a map', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
var body = {'url': 'http://example.com/upload', 'fields': 12};
- handleUploadForm(server, body);
+ handleUploadForm(globalPackageServer, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_fields_test.dart b/test/lish/upload_form_is_missing_fields_test.dart
index 524b10d..24453fb 100644
--- a/test/lish/upload_form_is_missing_fields_test.dart
+++ b/test/lish/upload_form_is_missing_fields_test.dart
@@ -4,7 +4,6 @@
import 'dart:convert';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -15,14 +14,14 @@
setUp(d.validPackage.create);
test('upload form is missing fields', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
var body = {'url': 'http://example.com/upload'};
- handleUploadForm(server, body);
+ handleUploadForm(globalPackageServer, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_url_test.dart b/test/lish/upload_form_is_missing_url_test.dart
index 838c54b..7861cf1 100644
--- a/test/lish/upload_form_is_missing_url_test.dart
+++ b/test/lish/upload_form_is_missing_url_test.dart
@@ -4,7 +4,6 @@
import 'dart:convert';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -15,9 +14,9 @@
setUp(d.validPackage.create);
test('upload form is missing url', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
@@ -25,7 +24,7 @@
'fields': {'field1': 'value1', 'field2': 'value2'}
};
- handleUploadForm(server, body);
+ handleUploadForm(globalPackageServer, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_provides_an_error_test.dart b/test/lish/upload_form_provides_an_error_test.dart
index e0a24cc..767ba10 100644
--- a/test/lish/upload_form_provides_an_error_test.dart
+++ b/test/lish/upload_form_provides_an_error_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -15,13 +14,15 @@
setUp(d.validPackage.create);
test('upload form provides an error', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages((_) {});
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer.extraHandlers['/api/packages/versions/new'] =
+ expectAsync1((request) {
+ expect(request.method, 'GET');
return shelf.Response.notFound(jsonEncode({
'error': {'message': 'your request sucked'}
}));
diff --git a/test/lish/upload_form_provides_invalid_json_test.dart b/test/lish/upload_form_provides_invalid_json_test.dart
index f3633d0..6e02185 100644
--- a/test/lish/upload_form_provides_invalid_json_test.dart
+++ b/test/lish/upload_form_provides_invalid_json_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -13,13 +12,13 @@
setUp(d.validPackage.create);
test('upload form provides invalid JSON', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- server.handler.expect('GET', '/api/packages/versions/new',
+ globalPackageServer.expect('GET', '/api/packages/versions/new',
(request) => shelf.Response.ok('{not json'));
expect(
diff --git a/test/lish/upload_form_url_is_not_a_string_test.dart b/test/lish/upload_form_url_is_not_a_string_test.dart
index f832ccb..cc9b14f 100644
--- a/test/lish/upload_form_url_is_not_a_string_test.dart
+++ b/test/lish/upload_form_url_is_not_a_string_test.dart
@@ -4,7 +4,6 @@
import 'dart:convert';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -15,9 +14,9 @@
setUp(d.validPackage.create);
test('upload form url is not a string', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
@@ -26,7 +25,7 @@
'fields': {'field1': 'value1', 'field2': 'value2'}
};
- handleUploadForm(server, body);
+ handleUploadForm(globalPackageServer, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/utils.dart b/test/lish/utils.dart
index 2389205..0a67350 100644
--- a/test/lish/utils.dart
+++ b/test/lish/utils.dart
@@ -5,16 +5,17 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
-void handleUploadForm(ShelfTestServer server, [Map body]) {
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+import '../test_pub.dart';
+
+void handleUploadForm(PackageServer server, [Map body]) {
+ server.expect('GET', '/api/packages/versions/new', (request) {
expect(
request.headers, containsPair('authorization', 'Bearer access token'));
body ??= {
- 'url': server.url.resolve('/upload').toString(),
+ 'url': Uri.parse(server.url).resolve('/upload').toString(),
'fields': {'field1': 'value1', 'field2': 'value2'}
};
@@ -23,14 +24,14 @@
});
}
-void handleUpload(ShelfTestServer server) {
- server.handler.expect('POST', '/upload', (request) {
+void handleUpload(PackageServer server) {
+ server.expect('POST', '/upload', (request) {
// TODO(nweiz): Once a multipart/form-data parser in Dart exists, validate
// that the request body is correctly formatted. See issue 6952.
return request
.read()
.drain()
.then((_) => server.url)
- .then((url) => shelf.Response.found(url.resolve('/create')));
+ .then((url) => shelf.Response.found(Uri.parse(url).resolve('/create')));
});
}
diff --git a/test/oauth2/logout_test.dart b/test/oauth2/logout_test.dart
index 4489f79..d1dee58 100644
--- a/test/oauth2/logout_test.dart
+++ b/test/oauth2/logout_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -10,9 +9,9 @@
void main() {
test('with an existing credentials.json, deletes it.', () async {
- var server = await ShelfTestServer.create();
+ await servePackages();
await d
- .credentialsFile(server, 'access token',
+ .credentialsFile(globalPackageServer, 'access token',
refreshToken: 'refresh token',
expiration: DateTime.now().add(Duration(hours: 1)))
.create();
diff --git a/test/oauth2/utils.dart b/test/oauth2/utils.dart
index 464e2fa..4eb2720 100644
--- a/test/oauth2/utils.dart
+++ b/test/oauth2/utils.dart
@@ -7,13 +7,14 @@
import 'package:http/http.dart' as http;
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:test_process/test_process.dart';
import 'package:pub/src/utils.dart';
-Future authorizePub(TestProcess pub, ShelfTestServer server,
+import '../test_pub.dart';
+
+Future authorizePub(TestProcess pub, PackageServer server,
[String accessToken = 'access token']) async {
await expectLater(
pub.stdout,
@@ -39,8 +40,8 @@
equals('https://pub.dartlang.org/authorized'));
}
-void handleAccessTokenRequest(ShelfTestServer server, String accessToken) {
- server.handler.expect('POST', '/token', (request) async {
+void handleAccessTokenRequest(PackageServer server, String accessToken) {
+ server.expect('POST', '/token', (request) async {
var body = await request.readAsString();
expect(body, matches(RegExp(r'(^|&)code=access\+code(&|$)')));
diff --git a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
index 838f89f..c7e5375 100644
--- a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,14 +15,14 @@
'saves credentials.json', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
+ await servePackages();
await d.dir(cachePath, [d.file('credentials.json', '{bad json')]).create();
- var pub = await startPublish(server);
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- await authorizePub(pub, server, 'new access token');
+ await authorizePub(pub, globalPackageServer, 'new access token');
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -34,6 +33,6 @@
// do so rather than killing it so it'll write out the credentials file.
await pub.shouldExit(1);
- await d.credentialsFile(server, 'new access token').validate();
+ await d.credentialsFile(globalPackageServer, 'new access token').validate();
});
}
diff --git a/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart b/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
index 40ce91e..4994503 100644
--- a/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
+++ b/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -13,18 +11,12 @@
test('with a pre-existing credentials.json does not authenticate', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
+
await confirmPublish(pub);
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
- expect(request.headers,
- containsPair('authorization', 'Bearer access token'));
-
- return shelf.Response(200);
- });
-
await pub.kill();
});
}
diff --git a/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index a57bcf2..c8b56c3 100644
--- a/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -6,7 +6,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -20,16 +19,16 @@
'saves credentials.json', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
+ await servePackages();
await d
- .credentialsFile(server, 'access token',
+ .credentialsFile(globalPackageServer, 'access token',
refreshToken: 'bad refresh token',
expiration: DateTime.now().subtract(Duration(hours: 1)))
.create();
- var pub = await startPublish(server);
+ var pub = await startPublish(globalPackageServer);
- server.handler.expect('POST', '/token', (request) {
+ globalPackageServer.expect('POST', '/token', (request) {
return request.read().drain().then((_) {
return shelf.Response(400,
body: jsonEncode({'error': 'invalid_request'}),
@@ -40,10 +39,11 @@
await confirmPublish(pub);
await expectLater(pub.stdout, emits(startsWith('Uploading...')));
- await authorizePub(pub, server, 'new access token');
+ await authorizePub(pub, globalPackageServer, 'new access token');
var done = Completer();
- server.handler.expect('GET', '/api/packages/versions/new', (request) async {
+ globalPackageServer.expect('GET', '/api/packages/versions/new',
+ (request) async {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -55,6 +55,5 @@
});
await done.future;
- await server.close();
});
}
diff --git a/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index 3290846..de2e53c 100644
--- a/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -17,17 +16,17 @@
'refreshed access token to credentials.json', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
+ await servePackages();
await d
- .credentialsFile(server, 'access token',
+ .credentialsFile(globalPackageServer, 'access token',
refreshToken: 'refresh token',
expiration: DateTime.now().subtract(Duration(hours: 1)))
.create();
- var pub = await startPublish(server);
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- server.handler.expect('POST', '/token', (request) {
+ globalPackageServer.expect('POST', '/token', (request) {
return request.readAsString().then((body) {
expect(
body, matches(RegExp(r'(^|&)refresh_token=refresh\+token(&|$)')));
@@ -39,7 +38,7 @@
});
});
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -49,7 +48,7 @@
await pub.shouldExit();
await d
- .credentialsFile(server, 'new access token',
+ .credentialsFile(globalPackageServer, 'new access token',
refreshToken: 'refresh token')
.validate();
});
diff --git a/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart b/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
index 75a37d4..14009a7 100644
--- a/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
+++ b/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,22 +15,22 @@
'authenticates again and saves credentials.json', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
+ await servePackages();
await d
- .credentialsFile(server, 'access token',
+ .credentialsFile(globalPackageServer, 'access token',
expiration: DateTime.now().subtract(Duration(hours: 1)))
.create();
- var pub = await startPublish(server);
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
await expectLater(
pub.stderr,
emits("Pub's authorization to upload packages has expired and "
"can't be automatically refreshed."));
- await authorizePub(pub, server, 'new access token');
+ await authorizePub(pub, globalPackageServer, 'new access token');
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -42,6 +41,6 @@
// do so rather than killing it so it'll write out the credentials file.
await pub.shouldExit(1);
- await d.credentialsFile(server, 'new access token').validate();
+ await d.credentialsFile(globalPackageServer, 'new access token').validate();
});
}
diff --git a/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart b/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
index b781f02..e1dae14 100644
--- a/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
+++ b/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,12 +15,12 @@
'credentials.json', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
- var pub = await startPublish(server);
+ await servePackages();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- await authorizePub(pub, server);
+ await authorizePub(pub, globalPackageServer);
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer access token'));
@@ -32,6 +31,6 @@
// do so rather than killing it so it'll write out the credentials file.
await pub.shouldExit(1);
- await d.credentialsFile(server, 'access token').validate();
+ await d.credentialsFile(globalPackageServer, 'access token').validate();
});
}
diff --git a/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index 20ca653..136342f 100644
--- a/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -5,7 +5,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
@@ -16,13 +15,13 @@
'with server-rejected credentials, authenticates again and saves '
'credentials.json', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPublish(server);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPublish(globalPackageServer);
await confirmPublish(pub);
- server.handler.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer.expect('GET', '/api/packages/versions/new', (request) {
return shelf.Response(401,
body: jsonEncode({
'error': {'message': 'your token sucks'}
diff --git a/test/package_server.dart b/test/package_server.dart
index 493bcba..58b2550 100644
--- a/test/package_server.dart
+++ b/test/package_server.dart
@@ -7,7 +7,9 @@
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
+import 'package:shelf/shelf.dart' as shelf;
import 'package:test/test.dart';
+import 'package:test/test.dart' as test show expect;
import 'descriptor.dart' as d;
import 'test_pub.dart';
@@ -21,8 +23,8 @@
///
/// Calls [callback] with a [PackageServerBuilder] that's used to specify
/// which packages to serve.
-Future servePackages(void Function(PackageServerBuilder) callback) async {
- _globalPackageServer = await PackageServer.start(callback);
+Future servePackages([void Function(PackageServerBuilder) callback]) async {
+ _globalPackageServer = await PackageServer.start(callback ?? (_) {});
globalServer = _globalPackageServer._inner;
addTearDown(() {
@@ -66,6 +68,9 @@
/// The URL for the server.
String get url => 'http://localhost:$port';
+ /// Handlers for requests not easily described as packages.
+ Map<Pattern, shelf.Handler> get extraHandlers => _inner.extraHandlers;
+
/// Creates an HTTP server that replicates the structure of pub.dartlang.org.
///
/// Calls [callback] with a [PackageServerBuilder] that's used to specify
@@ -122,6 +127,15 @@
});
}
+ // Installs a handler at [pattern] that expects to be called exactly once with
+ // the given [method].
+ void expect(String method, Pattern pattern, shelf.Handler handler) {
+ extraHandlers[pattern] = expectAsync1((request) {
+ test.expect(request.method, method);
+ return handler(request);
+ });
+ }
+
/// Returns the path of [package] at [version], installed from this server, in
/// the pub cache.
String pathInCache(String package, String version) => p.join(
diff --git a/test/pub_uploader_test.dart b/test/pub_uploader_test.dart
index 34390ef..1de8708 100644
--- a/test/pub_uploader_test.dart
+++ b/test/pub_uploader_test.dart
@@ -6,7 +6,6 @@
import 'dart:convert';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';
import 'package:test_process/test_process.dart';
@@ -29,9 +28,8 @@
See https://dart.dev/tools/pub/cmd/pub-uploader for detailed documentation.
''';
-Future<TestProcess> startPubUploader(
- ShelfTestServer server, List<String> args) {
- var tokenEndpoint = server.url.resolve('/token').toString();
+Future<TestProcess> startPubUploader(PackageServer server, List<String> args) {
+ var tokenEndpoint = Uri.parse(server.url).resolve('/token').toString();
var allArgs = ['uploader', '--server', tokenEndpoint, ...args];
return startPub(args: allArgs, tokenEndpoint: tokenEndpoint);
}
@@ -59,12 +57,13 @@
});
test('adds an uploader', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub =
- await startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPubUploader(
+ globalPackageServer, ['--package', 'pkg', 'add', 'email']);
- server.handler.expect('POST', '/api/packages/pkg/uploaders', (request) {
+ globalPackageServer.expect('POST', '/api/packages/pkg/uploaders',
+ (request) {
return request.readAsString().then((body) {
expect(body, equals('email=email'));
@@ -81,12 +80,12 @@
});
test('removes an uploader', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub =
- await startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPubUploader(
+ globalPackageServer, ['--package', 'pkg', 'remove', 'email']);
- server.handler.expect('DELETE', '/api/packages/pkg/uploaders/email',
+ globalPackageServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
(request) {
return shelf.Response.ok(
jsonEncode({
@@ -102,11 +101,11 @@
test('defaults to the current package', () async {
await d.validPackage.create();
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub = await startPubUploader(server, ['add', 'email']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPubUploader(globalPackageServer, ['add', 'email']);
- server.handler.expect('POST', '/api/packages/test_pkg/uploaders',
+ globalPackageServer.expect('POST', '/api/packages/test_pkg/uploaders',
(request) {
return shelf.Response.ok(
jsonEncode({
@@ -120,12 +119,13 @@
});
test('add provides an error', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub =
- await startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPubUploader(
+ globalPackageServer, ['--package', 'pkg', 'add', 'email']);
- server.handler.expect('POST', '/api/packages/pkg/uploaders', (request) {
+ globalPackageServer.expect('POST', '/api/packages/pkg/uploaders',
+ (request) {
return shelf.Response(400,
body: jsonEncode({
'error': {'message': 'Bad job!'}
@@ -138,12 +138,12 @@
});
test('remove provides an error', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
var pub = await startPubUploader(
- server, ['--package', 'pkg', 'remove', 'e/mail']);
+ globalPackageServer, ['--package', 'pkg', 'remove', 'e/mail']);
- server.handler.expect('DELETE', '/api/packages/pkg/uploaders/e%2Fmail',
+ globalPackageServer.expect('DELETE', '/api/packages/pkg/uploaders/e%2Fmail',
(request) {
return shelf.Response(400,
body: jsonEncode({
@@ -157,12 +157,12 @@
});
test('add provides invalid JSON', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub =
- await startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPubUploader(
+ globalPackageServer, ['--package', 'pkg', 'add', 'email']);
- server.handler.expect('POST', '/api/packages/pkg/uploaders',
+ globalPackageServer.expect('POST', '/api/packages/pkg/uploaders',
(request) => shelf.Response.ok('{not json'));
expect(
@@ -173,12 +173,12 @@
});
test('remove provides invalid JSON', () async {
- var server = await ShelfTestServer.create();
- await d.credentialsFile(server, 'access token').create();
- var pub =
- await startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
+ await servePackages();
+ await d.credentialsFile(globalPackageServer, 'access token').create();
+ var pub = await startPubUploader(
+ globalPackageServer, ['--package', 'pkg', 'remove', 'email']);
- server.handler.expect('DELETE', '/api/packages/pkg/uploaders/email',
+ globalPackageServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
(request) => shelf.Response.ok('{not json'));
expect(
diff --git a/test/test_pub.dart b/test/test_pub.dart
index 38ed12a..deb68b9 100644
--- a/test/test_pub.dart
+++ b/test/test_pub.dart
@@ -17,7 +17,6 @@
import 'package:http/testing.dart';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
-import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart' hide fail;
import 'package:test/test.dart' as test show fail;
import 'package:test_process/test_process.dart';
@@ -39,6 +38,7 @@
import 'descriptor.dart' as d;
import 'descriptor_server.dart';
+import 'package_server.dart';
export 'descriptor_server.dart';
export 'package_server.dart';
@@ -288,10 +288,10 @@
/// package server.
///
/// Any futures in [args] will be resolved before the process is started.
-Future<PubProcess> startPublish(ShelfTestServer server,
+Future<PubProcess> startPublish(PackageServer server,
{List<String> args}) async {
- var tokenEndpoint = server.url.resolve('/token').toString();
- args = ['lish', '--server', tokenEndpoint, ...?args];
+ var tokenEndpoint = Uri.parse(server.url).resolve('/token').toString();
+ args = ['lish', '--server', server.url, ...?args];
return await startPub(args: args, tokenEndpoint: tokenEndpoint);
}
@@ -751,14 +751,12 @@
/// Schedules a single [Validator] to run on the [appPath].
///
-/// Returns a scheduled Future that contains the errors and warnings produced
-/// by that validator.
-Future<Pair<List<String>, List<String>>> validatePackage(
- ValidatorCreator fn) async {
+/// Returns a scheduled Future that contains the validator after validation.
+Future<Validator> validatePackage(ValidatorCreator fn) async {
var cache = SystemCache(rootDir: _pathInSandbox(cachePath));
var validator = fn(Entrypoint(_pathInSandbox(appPath), cache));
await validator.validate();
- return Pair(validator.errors, validator.warnings);
+ return validator;
}
/// A matcher that matches a Pair.
diff --git a/test/validator/changelog_test.dart b/test/validator/changelog_test.dart
index 4870cc9..67547e6 100644
--- a/test/validator/changelog_test.dart
+++ b/test/validator/changelog_test.dart
@@ -28,7 +28,7 @@
* Passes Turing test.
'''),
]).create();
- expectNoValidationError(changelog);
+ await expectValidation(changelog);
});
});
@@ -37,7 +37,7 @@
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0'),
]).create();
- expectValidationWarning(changelog);
+ await expectValidation(changelog, warnings: isNotEmpty);
});
test('has has a CHANGELOG not named CHANGELOG.md', () async {
@@ -50,7 +50,7 @@
* Passes Turing test.
'''),
]).create();
- expectValidationWarning(changelog);
+ await expectValidation(changelog, warnings: isNotEmpty);
});
test('has a CHANGELOG that doesn\'t include the current package version',
@@ -64,7 +64,7 @@
* Passes Turing test.
'''),
]).create();
- expectValidationWarning(changelog);
+ await expectValidation(changelog, warnings: isNotEmpty);
});
test('has a CHANGELOG with invalid utf-8', () async {
@@ -72,7 +72,7 @@
d.libPubspec('test_pkg', '1.0.0'),
d.file('CHANGELOG.md', [192]),
]).create();
- expectValidationWarning(changelog);
+ await expectValidation(changelog, warnings: isNotEmpty);
});
});
}
diff --git a/test/validator/compiled_dartdoc_test.dart b/test/validator/compiled_dartdoc_test.dart
index 78c34fb..495f72f 100644
--- a/test/validator/compiled_dartdoc_test.dart
+++ b/test/validator/compiled_dartdoc_test.dart
@@ -19,7 +19,7 @@
setUp(d.validPackage.create);
group('should consider a package valid if it', () {
- test('looks normal', () => expectNoValidationError(compiledDartdoc));
+ test('looks normal', () => expectValidation(compiledDartdoc));
test('has most but not all files from compiling dartdoc', () async {
await d.dir(appPath, [
@@ -30,7 +30,7 @@
d.file('dart-logo-small.png', '')
])
]).create();
- expectNoValidationError(compiledDartdoc);
+ await expectValidation(compiledDartdoc);
});
test('contains compiled dartdoc in a hidden directory', () async {
@@ -45,7 +45,7 @@
d.file('client-live-nav.js', '')
])
]).create();
- expectNoValidationError(compiledDartdoc);
+ await expectValidation(compiledDartdoc);
});
test('contains compiled dartdoc in a gitignored directory', () async {
@@ -61,7 +61,7 @@
]),
d.file('.gitignore', '/doc-out')
]).create();
- expectNoValidationError(compiledDartdoc);
+ await expectValidation(compiledDartdoc);
});
});
@@ -77,7 +77,7 @@
])
]).create();
- expectValidationWarning(compiledDartdoc);
+ await expectValidation(compiledDartdoc, warnings: isNotEmpty);
});
test(
@@ -95,7 +95,7 @@
])
]).create();
- expectValidationWarning(compiledDartdoc);
+ await expectValidation(compiledDartdoc, warnings: isNotEmpty);
});
});
}
diff --git a/test/validator/dependency_override_test.dart b/test/validator/dependency_override_test.dart
index f9ae01e..bff7597 100644
--- a/test/validator/dependency_override_test.dart
+++ b/test/validator/dependency_override_test.dart
@@ -27,7 +27,7 @@
})
]).create();
- expectNoValidationError(dependencyOverride);
+ await expectValidation(dependencyOverride);
});
group('should consider a package invalid if', () {
@@ -39,7 +39,7 @@
})
]).create();
- expectValidationError(dependencyOverride);
+ await expectValidation(dependencyOverride, errors: isNotEmpty);
});
test('it has any non-dev dependency overrides', () async {
@@ -54,7 +54,7 @@
})
]).create();
- expectValidationError(dependencyOverride);
+ await expectValidation(dependencyOverride, errors: isNotEmpty);
});
});
}
diff --git a/test/validator/dependency_test.dart b/test/validator/dependency_test.dart
index 3d93b68..ddb6edd 100644
--- a/test/validator/dependency_test.dart
+++ b/test/validator/dependency_test.dart
@@ -20,15 +20,11 @@
Validator dependency(Entrypoint entrypoint) => DependencyValidator(entrypoint);
-void expectDependencyValidationError(String error) {
- expect(validatePackage(dependency),
- completion(pairOf(anyElement(contains(error)), isEmpty)));
-}
+Future<void> expectDependencyValidationError(String substring) =>
+ expectValidation(dependency, errors: anyElement(contains(substring)));
-void expectDependencyValidationWarning(String warning) {
- expect(validatePackage(dependency),
- completion(pairOf(isEmpty, anyElement(contains(warning)))));
-}
+Future<void> expectDependencyValidationWarning(String substring) =>
+ expectValidation(dependency, warnings: anyElement(contains(substring)));
/// Sets up a test package with dependency [dep] and mocks a server with
/// [hostedVersions] of the package available.
@@ -62,7 +58,7 @@
group('should consider a package valid if it', () {
test('looks normal', () async {
await d.validPackage.create();
- expectNoValidationError(dependency);
+ await expectValidation(dependency);
});
test('has a ^ constraint with an appropriate SDK constraint', () async {
@@ -70,7 +66,7 @@
d.libPubspec('test_pkg', '1.0.0',
deps: {'foo': '^1.2.3'}, sdk: '>=1.8.0 <2.0.0')
]).create();
- expectNoValidationError(dependency);
+ await expectValidation(dependency);
});
test('with a dependency on a pre-release while being one', () async {
@@ -83,7 +79,7 @@
)
]).create();
- expectNoValidationError(dependency);
+ await expectValidation(dependency);
});
test('has a git path dependency with an appropriate SDK constraint',
@@ -102,7 +98,7 @@
]).create();
// We should get a warning for using a git dependency, but not an error.
- expectDependencyValidationWarning(' foo: any');
+ await expectDependencyValidationWarning(' foo: any');
});
test('depends on Flutter from an SDK source', () async {
@@ -117,7 +113,7 @@
})
]).create();
- expectNoValidationError(dependency);
+ await expectValidation(dependency);
});
test(
@@ -134,7 +130,7 @@
})
]).create();
- expectNoValidationError(dependency);
+ await expectValidation(dependency);
});
test(
@@ -151,7 +147,7 @@
})
]).create();
- expectNoValidationError(dependency);
+ await expectValidation(dependency);
});
});
@@ -163,7 +159,7 @@
test('and should suggest the hosted primary version', () async {
await setUpDependency({'git': 'git://github.com/dart-lang/foo'},
hostedVersions: ['3.0.0-pre', '2.0.0', '1.0.0']);
- expectDependencyValidationWarning(' foo: ^2.0.0');
+ await expectDependencyValidationWarning(' foo: ^2.0.0');
});
test(
@@ -171,7 +167,7 @@
"it's the only version available", () async {
await setUpDependency({'git': 'git://github.com/dart-lang/foo'},
hostedVersions: ['3.0.0-pre', '2.0.0-pre']);
- expectDependencyValidationWarning(' foo: ^3.0.0-pre');
+ await expectDependencyValidationWarning(' foo: ^3.0.0-pre');
});
test(
@@ -179,7 +175,7 @@
'pre-1.0.0', () async {
await setUpDependency({'git': 'git://github.com/dart-lang/foo'},
hostedVersions: ['0.0.1', '0.0.2']);
- expectDependencyValidationWarning(' foo: ^0.0.2');
+ await expectDependencyValidationWarning(' foo: ^0.0.2');
});
});
@@ -189,7 +185,7 @@
'git': 'git://github.com/dart-lang/foo',
'version': '>=1.0.0 <2.0.0'
});
- expectDependencyValidationWarning(' foo: ">=1.0.0 <2.0.0"');
+ await expectDependencyValidationWarning(' foo: ">=1.0.0 <2.0.0"');
});
test(
@@ -197,7 +193,7 @@
'concrete', () async {
await setUpDependency(
{'git': 'git://github.com/dart-lang/foo', 'version': '0.2.3'});
- expectDependencyValidationWarning(' foo: 0.2.3');
+ await expectDependencyValidationWarning(' foo: 0.2.3');
});
});
});
@@ -207,7 +203,7 @@
test('and should suggest the hosted primary version', () async {
await setUpDependency({'path': path.join(d.sandbox, 'foo')},
hostedVersions: ['3.0.0-pre', '2.0.0', '1.0.0']);
- expectDependencyValidationError(' foo: ^2.0.0');
+ await expectDependencyValidationError(' foo: ^2.0.0');
});
test(
@@ -215,7 +211,7 @@
"it's the only version available", () async {
await setUpDependency({'path': path.join(d.sandbox, 'foo')},
hostedVersions: ['3.0.0-pre', '2.0.0-pre']);
- expectDependencyValidationError(' foo: ^3.0.0-pre');
+ await expectDependencyValidationError(' foo: ^3.0.0-pre');
});
test(
@@ -223,7 +219,7 @@
'pre-1.0.0', () async {
await setUpDependency({'path': path.join(d.sandbox, 'foo')},
hostedVersions: ['0.0.1', '0.0.2']);
- expectDependencyValidationError(' foo: ^0.0.2');
+ await expectDependencyValidationError(' foo: ^0.0.2');
});
});
@@ -233,7 +229,7 @@
'path': path.join(d.sandbox, 'foo'),
'version': '>=1.0.0 <2.0.0'
});
- expectDependencyValidationError(' foo: ">=1.0.0 <2.0.0"');
+ await expectDependencyValidationError(' foo: ">=1.0.0 <2.0.0"');
});
test(
@@ -241,7 +237,7 @@
'concrete', () async {
await setUpDependency(
{'path': path.join(d.sandbox, 'foo'), 'version': '0.2.3'});
- expectDependencyValidationError(' foo: 0.2.3');
+ await expectDependencyValidationError(' foo: 0.2.3');
});
});
});
@@ -253,10 +249,8 @@
d.libPubspec('test_pkg', '1.0.0', deps: {'foo': 'any'})
]).create();
- expect(
- validatePackage(dependency),
- completion(
- pairOf(isEmpty, everyElement(isNot(contains('\n foo:'))))));
+ await expectValidation(dependency,
+ warnings: everyElement(isNot(contains('\n foo:'))));
});
test(
@@ -280,10 +274,8 @@
}))
]).create();
- expect(
- validatePackage(dependency),
- completion(
- pairOf(isEmpty, everyElement(isNot(contains('\n foo:'))))));
+ await expectValidation(dependency,
+ warnings: everyElement(isNot(contains('\n foo:'))));
});
});
@@ -309,7 +301,7 @@
}))
]).create();
- expectDependencyValidationWarning(' foo: ^1.2.3');
+ await expectDependencyValidationWarning(' foo: ^1.2.3');
});
test(
@@ -333,7 +325,7 @@
}))
]).create();
- expectDependencyValidationWarning(' foo: ^0.1.2');
+ await expectDependencyValidationWarning(' foo: ^0.1.2');
});
});
});
@@ -348,7 +340,8 @@
)
]).create();
- expectDependencyValidationWarning('Packages dependent on a pre-release');
+ await expectDependencyValidationWarning(
+ 'Packages dependent on a pre-release');
});
test(
'with a single-version dependency and it should suggest a '
@@ -357,7 +350,7 @@
d.libPubspec('test_pkg', '1.0.0', deps: {'foo': '1.2.3'})
]).create();
- expectDependencyValidationWarning(' foo: ^1.2.3');
+ await expectDependencyValidationWarning(' foo: ^1.2.3');
});
group('has a dependency without a lower bound', () {
@@ -367,10 +360,8 @@
d.libPubspec('test_pkg', '1.0.0', deps: {'foo': '<3.0.0'})
]).create();
- expect(
- validatePackage(dependency),
- completion(
- pairOf(isEmpty, everyElement(isNot(contains('\n foo:'))))));
+ await expectValidation(dependency,
+ warnings: everyElement(isNot(contains('\n foo:'))));
});
test(
@@ -394,10 +385,8 @@
}))
]).create();
- expect(
- validatePackage(dependency),
- completion(
- pairOf(isEmpty, everyElement(isNot(contains('\n foo:'))))));
+ await expectValidation(dependency,
+ warnings: everyElement(isNot(contains('\n foo:'))));
});
});
@@ -423,7 +412,7 @@
}))
]).create();
- expectDependencyValidationWarning(' foo: ">=1.2.3 <3.0.0"');
+ await expectDependencyValidationWarning(' foo: ">=1.2.3 <3.0.0"');
});
test('and it should preserve the upper-bound operator', () async {
@@ -445,7 +434,7 @@
}))
]).create();
- expectDependencyValidationWarning(' foo: ">=1.2.3 <=3.0.0"');
+ await expectDependencyValidationWarning(' foo: ">=1.2.3 <=3.0.0"');
});
test(
@@ -469,7 +458,7 @@
}))
]).create();
- expectDependencyValidationWarning(' foo: ^1.2.3');
+ await expectDependencyValidationWarning(' foo: ^1.2.3');
});
});
});
@@ -481,7 +470,7 @@
d.libPubspec('test_pkg', '1.0.0', deps: {'foo': '>=1.2.3'})
]).create();
- expectDependencyValidationWarning(' foo: ^1.2.3');
+ await expectDependencyValidationWarning(' foo: ^1.2.3');
});
test('and it should preserve the lower-bound operator', () async {
@@ -489,7 +478,7 @@
d.libPubspec('test_pkg', '1.0.0', deps: {'foo': '>1.2.3'})
]).create();
- expectDependencyValidationWarning(' foo: ">1.2.3 <2.0.0"');
+ await expectDependencyValidationWarning(' foo: ">1.2.3 <2.0.0"');
});
});
@@ -499,7 +488,7 @@
d.libPubspec('integration_pkg', '1.0.0', deps: {'foo': '^1.2.3'})
]).create();
- expectDependencyValidationError(' sdk: ">=1.8.0 <2.0.0"');
+ await expectDependencyValidationError(' sdk: ">=1.8.0 <2.0.0"');
});
test('with a too-broad SDK constraint', () async {
@@ -508,7 +497,7 @@
deps: {'foo': '^1.2.3'}, sdk: '>=1.5.0 <2.0.0')
]).create();
- expectDependencyValidationError(' sdk: ">=1.8.0 <2.0.0"');
+ await expectDependencyValidationError(' sdk: ">=1.8.0 <2.0.0"');
});
});
@@ -522,10 +511,9 @@
})
]).create();
- expect(
- validatePackage(dependency),
- completion(pairOf(anyElement(contains(' sdk: ">=2.0.0 <3.0.0"')),
- anyElement(contains(' foo: any')))));
+ await expectValidation(dependency,
+ errors: anyElement(contains(' sdk: ">=2.0.0 <3.0.0"')),
+ warnings: anyElement(contains(' foo: any')));
});
test('with a too-broad SDK constraint', () async {
@@ -542,10 +530,9 @@
sdk: '>=1.24.0 <3.0.0')
]).create();
- expect(
- validatePackage(dependency),
- completion(pairOf(anyElement(contains(' sdk: ">=2.0.0 <3.0.0"')),
- anyElement(contains(' foo: any')))));
+ await expectValidation(dependency,
+ errors: anyElement(contains(' sdk: ">=2.0.0 <3.0.0"')),
+ warnings: anyElement(contains(' foo: any')));
});
});
@@ -559,7 +546,7 @@
})
]).create();
- expectDependencyValidationError(
+ await expectDependencyValidationError(
'Packages with package features may not be published yet.');
});
@@ -576,7 +563,7 @@
})
]).create();
- expectDependencyValidationError(
+ await expectDependencyValidationError(
'Packages with package features may not be published yet.');
});
@@ -585,7 +572,7 @@
d.libPubspec('test_pkg', '1.0.0', deps: {'flutter': '>=1.2.3 <2.0.0'})
]).create();
- expectDependencyValidationError('sdk: >=1.2.3 <2.0.0');
+ await expectDependencyValidationError('sdk: >=1.2.3 <2.0.0');
});
test('depends on a Flutter package from an unknown SDK', () async {
@@ -599,7 +586,7 @@
})
]).create();
- expectDependencyValidationError(
+ await expectDependencyValidationError(
'Unknown SDK "fblthp" for dependency "foo".');
});
@@ -616,7 +603,7 @@
})
]).create();
- expectDependencyValidationError('sdk: ">=1.19.0 <2.0.0"');
+ await expectDependencyValidationError('sdk: ">=1.19.0 <2.0.0"');
});
test('depends on a Flutter package with no SDK constraint', () async {
@@ -630,7 +617,7 @@
})
]).create();
- expectDependencyValidationError('sdk: ">=1.19.0 <2.0.0"');
+ await expectDependencyValidationError('sdk: ">=1.19.0 <2.0.0"');
});
test('depends on a Fuchsia package with a too-broad SDK constraint',
@@ -646,7 +633,7 @@
})
]).create();
- expectDependencyValidationError('sdk: ">=2.0.0 <3.0.0"');
+ await expectDependencyValidationError('sdk: ">=2.0.0 <3.0.0"');
});
test('depends on a Fuchsia package with no SDK constraint', () async {
@@ -660,7 +647,7 @@
})
]).create();
- expectDependencyValidationError('sdk: ">=2.0.0 <3.0.0"');
+ await expectDependencyValidationError('sdk: ">=2.0.0 <3.0.0"');
});
});
}
diff --git a/test/validator/deprecated_fields_test.dart b/test/validator/deprecated_fields_test.dart
index 213ec56..4d29c03 100644
--- a/test/validator/deprecated_fields_test.dart
+++ b/test/validator/deprecated_fields_test.dart
@@ -18,9 +18,8 @@
void main() {
setUp(d.validPackage.create);
- test('should not warn if neither transformers or web is included', () {
- expectNoValidationError(deprecatedFields);
- });
+ test('should not warn if neither transformers or web is included',
+ () => expectValidation(deprecatedFields));
test('should warn if pubspec has a transformers section', () async {
await d.dir(appPath, [
@@ -29,7 +28,7 @@
})
]).create();
- expectValidationWarning(deprecatedFields);
+ await expectValidation(deprecatedFields, warnings: isNotEmpty);
});
test('should warn if pubspec has a web section', () async {
@@ -39,7 +38,7 @@
})
]).create();
- expectValidationWarning(deprecatedFields);
+ await expectValidation(deprecatedFields, warnings: isNotEmpty);
});
test('should warn if pubspec has an author', () async {
@@ -47,7 +46,7 @@
d.pubspec({'author': 'Ronald <ronald@example.com>'})
]).create();
- expectValidationWarning(deprecatedFields);
+ await expectValidation(deprecatedFields, warnings: isNotEmpty);
});
test('should warn if pubspec has a list of authors', () async {
@@ -57,6 +56,6 @@
})
]).create();
- expectValidationWarning(deprecatedFields);
+ await expectValidation(deprecatedFields, warnings: isNotEmpty);
});
}
diff --git a/test/validator/directory_test.dart b/test/validator/directory_test.dart
index 13a110a..ea05e24 100644
--- a/test/validator/directory_test.dart
+++ b/test/validator/directory_test.dart
@@ -18,13 +18,13 @@
group('should consider a package valid if it', () {
setUp(d.validPackage.create);
- test('looks normal', () => expectNoValidationError(directory));
+ test('looks normal', () => expectValidation(directory));
test('has a nested directory named "tools"', () async {
await d.dir(appPath, [
d.dir('foo', [d.dir('tools')])
]).create();
- expectNoValidationError(directory);
+ await expectValidation(directory);
});
});
@@ -46,7 +46,7 @@
for (var name in names) {
test('"$name"', () async {
await d.dir(appPath, [d.dir(name)]).create();
- expectValidationWarning(directory);
+ await expectValidation(directory, warnings: isNotEmpty);
});
}
});
diff --git a/test/validator/executable_test.dart b/test/validator/executable_test.dart
index fa32d58..df4222d 100644
--- a/test/validator/executable_test.dart
+++ b/test/validator/executable_test.dart
@@ -30,7 +30,7 @@
d.file('two.dart', "main() => print('ok');")
])
]).create();
- expectNoValidationError(executable);
+ await expectValidation(executable);
});
});
@@ -43,7 +43,7 @@
'executables': {'nope': 'not_there', 'nada': null}
})
]).create();
- expectValidationWarning(executable);
+ await expectValidation(executable, warnings: isNotEmpty);
});
test('has .gitignored one or more listed executables', () async {
@@ -59,7 +59,7 @@
]),
d.file('.gitignore', 'bin')
]).create();
- expectValidationWarning(executable);
+ await expectValidation(executable, warnings: isNotEmpty);
});
});
}
diff --git a/test/validator/flutter_plugin_format_test.dart b/test/validator/flutter_plugin_format_test.dart
index 61d8309..8906ec8 100644
--- a/test/validator/flutter_plugin_format_test.dart
+++ b/test/validator/flutter_plugin_format_test.dart
@@ -19,7 +19,7 @@
group('should consider a package valid if it', () {
setUp(d.validPackage.create);
- test('looks normal', () => expectNoValidationError(flutterPluginFormat));
+ test('looks normal', () => expectValidation(flutterPluginFormat));
test('is a Flutter 1.9.0 package', () async {
var pkg = packageMap('test_pkg', '1.0.0', {
@@ -29,7 +29,7 @@
'flutter': '>=1.9.0 <2.0.0',
});
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat);
});
test('is a Flutter 1.10.0 package', () async {
@@ -40,7 +40,7 @@
'flutter': '>=1.10.0 <2.0.0',
});
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat);
});
test('is a Flutter 1.10.0-0 package', () async {
@@ -51,7 +51,7 @@
'flutter': '>=1.10.0-0 <2.0.0',
});
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat);
});
test('is a flutter 1.10.0 plugin with the new format', () async {
@@ -72,7 +72,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat);
});
});
@@ -100,7 +100,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, errors: isNotEmpty);
});
test('is a flutter 1.9.0 plugin with old format', () async {
@@ -118,7 +118,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationWarning(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, warnings: isNotEmpty);
});
test('is a flutter 1.9.0 plugin with new format', () async {
@@ -139,7 +139,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, errors: isNotEmpty);
});
test(
@@ -161,7 +161,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, errors: isNotEmpty);
});
test('is a non-flutter package with using the new format', () async {
@@ -179,7 +179,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, errors: isNotEmpty);
});
test('is a flutter 1.8.0 plugin with new format', () async {
@@ -200,7 +200,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, errors: isNotEmpty);
});
test('is a flutter 1.9.999 plugin with new format', () async {
@@ -221,7 +221,7 @@
},
};
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(flutterPluginFormat);
+ await expectValidation(flutterPluginFormat, errors: isNotEmpty);
});
});
}
diff --git a/test/validator/language_version_test.dart b/test/validator/language_version_test.dart
index 304b68a..94237c6 100644
--- a/test/validator/language_version_test.dart
+++ b/test/validator/language_version_test.dart
@@ -30,34 +30,33 @@
])
]).create();
await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.7.0'});
- print(await d.file('.dart_tool/package_config.json').read());
}
void main() {
group('should consider a package valid if it', () {
test('has no library-level language version annotations', () async {
await setup(sdkConstraint: '>=2.4.0 <3.0.0');
- expectNoValidationError(validator);
+ await expectValidation(validator);
});
test('opts in to older language versions', () async {
await setup(
sdkConstraint: '>=2.4.0 <3.0.0', libraryLanguageVersion: '2.0');
await d.dir(appPath, []).create();
- expectNoValidationError(validator);
+ await expectValidation(validator);
});
test('opts in to same language versions', () async {
await setup(
sdkConstraint: '>=2.4.0 <3.0.0', libraryLanguageVersion: '2.4');
await d.dir(appPath, []).create();
- expectNoValidationError(validator);
+ await expectValidation(validator);
});
test('opts in to older language version, with non-range constraint',
() async {
await setup(sdkConstraint: '2.7.0', libraryLanguageVersion: '2.3');
await d.dir(appPath, []).create();
- expectNoValidationError(validator);
+ await expectValidation(validator);
});
});
@@ -65,11 +64,11 @@
test('opts in to a newer version.', () async {
await setup(
sdkConstraint: '>=2.4.1 <3.0.0', libraryLanguageVersion: '2.5');
- expectValidationError(validator);
+ await expectValidation(validator, errors: isNotEmpty);
});
test('opts in to a newer version, with non-range constraint.', () async {
await setup(sdkConstraint: '2.7.0', libraryLanguageVersion: '2.8');
- expectValidationError(validator);
+ await expectValidation(validator, errors: isNotEmpty);
});
});
}
diff --git a/test/validator/license_test.dart b/test/validator/license_test.dart
index eb77ef4..b1b7b23 100644
--- a/test/validator/license_test.dart
+++ b/test/validator/license_test.dart
@@ -20,13 +20,13 @@
group('should consider a package valid if it', () {
test('looks normal', () async {
await d.validPackage.create();
- expectNoValidationError(license);
+ await expectValidation(license);
});
test('has both LICENSE and UNLICENSE file', () async {
await d.validPackage.create();
await d.file(path.join(appPath, 'UNLICENSE'), '').create();
- expectNoValidationError(license);
+ await expectValidation(license);
});
});
@@ -35,28 +35,28 @@
await d.validPackage.create();
deleteEntry(path.join(d.sandbox, appPath, 'LICENSE'));
await d.file(path.join(appPath, 'COPYING'), '').create();
- expectValidationWarning(license);
+ await expectValidation(license, warnings: isNotEmpty);
});
test('has only an UNLICENSE file', () async {
await d.validPackage.create();
deleteEntry(path.join(d.sandbox, appPath, 'LICENSE'));
await d.file(path.join(appPath, 'UNLICENSE'), '').create();
- expectValidationWarning(license);
+ await expectValidation(license, warnings: isNotEmpty);
});
test('has only a prefixed LICENSE file', () async {
await d.validPackage.create();
deleteEntry(path.join(d.sandbox, appPath, 'LICENSE'));
await d.file(path.join(appPath, 'MIT_LICENSE'), '').create();
- expectValidationWarning(license);
+ await expectValidation(license, warnings: isNotEmpty);
});
test('has only a suffixed LICENSE file', () async {
await d.validPackage.create();
deleteEntry(path.join(d.sandbox, appPath, 'LICENSE'));
await d.file(path.join(appPath, 'LICENSE.md'), '').create();
- expectValidationWarning(license);
+ await expectValidation(license, warnings: isNotEmpty);
});
});
@@ -64,21 +64,21 @@
test('has no LICENSE file', () async {
await d.validPackage.create();
deleteEntry(path.join(d.sandbox, appPath, 'LICENSE'));
- expectValidationError(license);
+ await expectValidation(license, errors: isNotEmpty);
});
test('has a prefixed UNLICENSE file', () async {
await d.validPackage.create();
deleteEntry(path.join(d.sandbox, appPath, 'LICENSE'));
await d.file(path.join(appPath, 'MIT_UNLICENSE'), '').create();
- expectValidationError(license);
+ await expectValidation(license, errors: isNotEmpty);
});
test('has a .gitignored LICENSE file', () async {
var repo = d.git(appPath, [d.file('.gitignore', 'LICENSE')]);
await d.validPackage.create();
await repo.create();
- expectValidationError(license);
+ await expectValidation(license, errors: isNotEmpty);
});
});
}
diff --git a/test/validator/name_test.dart b/test/validator/name_test.dart
index 5acd257..3ea3d04 100644
--- a/test/validator/name_test.dart
+++ b/test/validator/name_test.dart
@@ -20,7 +20,7 @@
group('should consider a package valid if it', () {
setUp(d.validPackage.create);
- test('looks normal', () => expectNoValidationError(name));
+ test('looks normal', () => expectValidation(name));
test('has dots in potential library names', () async {
await d.dir(appPath, [
@@ -30,7 +30,7 @@
d.file('test_pkg.g.dart', 'int j = 2;')
])
]).create();
- expectNoValidationError(name);
+ await expectValidation(name);
});
test('has a name that starts with an underscore', () async {
@@ -38,7 +38,7 @@
d.libPubspec('_test_pkg', '1.0.0'),
d.dir('lib', [d.file('_test_pkg.dart', 'int i = 1;')])
]).create();
- expectNoValidationError(name);
+ await expectValidation(name);
});
});
@@ -47,7 +47,7 @@
test('has a package name that contains upper-case letters', () async {
await d.dir(appPath, [d.libPubspec('TestPkg', '1.0.0')]).create();
- expectValidationWarning(name);
+ await expectValidation(name, warnings: isNotEmpty);
});
test('has a single library named differently than the package', () async {
@@ -55,7 +55,7 @@
await d.dir(appPath, [
d.dir('lib', [d.file('best_pkg.dart', 'int i = 0;')])
]).create();
- expectValidationWarning(name);
+ await expectValidation(name, warnings: isNotEmpty);
});
});
}
diff --git a/test/validator/pubspec_field_test.dart b/test/validator/pubspec_field_test.dart
index fa6f85f..cdfb955 100644
--- a/test/validator/pubspec_field_test.dart
+++ b/test/validator/pubspec_field_test.dart
@@ -19,14 +19,14 @@
group('should consider a package valid if it', () {
setUp(d.validPackage.create);
- test('looks normal', () => expectNoValidationError(pubspecField));
+ test('looks normal', () => expectValidation(pubspecField));
test('has an HTTPS homepage URL', () async {
var pkg = packageMap('test_pkg', '1.0.0');
pkg['homepage'] = 'https://pub.dartlang.org';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(pubspecField);
+ await expectValidation(pubspecField);
});
test('has an HTTPS repository URL instead of homepage', () async {
@@ -35,7 +35,7 @@
pkg['repository'] = 'https://pub.dartlang.org';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(pubspecField);
+ await expectValidation(pubspecField);
});
test('has an HTTPS documentation URL', () async {
@@ -43,7 +43,7 @@
pkg['documentation'] = 'https://pub.dartlang.org';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectNoValidationError(pubspecField);
+ await expectValidation(pubspecField);
});
});
@@ -54,7 +54,7 @@
pkg.remove('homepage');
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationWarning(pubspecField);
+ await expectValidation(pubspecField, warnings: isNotEmpty);
});
});
@@ -66,7 +66,7 @@
pkg.remove('description');
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
test('has a non-string "homepage" field', () async {
@@ -74,7 +74,7 @@
pkg['homepage'] = 12;
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
test('has a non-string "repository" field', () async {
@@ -82,7 +82,7 @@
pkg['repository'] = 12;
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
test('has a non-string "description" field', () async {
@@ -90,7 +90,7 @@
pkg['description'] = 12;
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
test('has a non-HTTP homepage URL', () async {
@@ -98,7 +98,7 @@
pkg['homepage'] = 'file:///foo/bar';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
test('has a non-HTTP documentation URL', () async {
@@ -106,7 +106,7 @@
pkg['documentation'] = 'file:///foo/bar';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
test('has a non-HTTP repository URL', () async {
@@ -114,7 +114,7 @@
pkg['repository'] = 'file:///foo/bar';
await d.dir(appPath, [d.pubspec(pkg)]).create();
- expectValidationError(pubspecField);
+ await expectValidation(pubspecField, errors: isNotEmpty);
});
});
}
diff --git a/test/validator/pubspec_test.dart b/test/validator/pubspec_test.dart
index 3e61b3a..3aa0ef2 100644
--- a/test/validator/pubspec_test.dart
+++ b/test/validator/pubspec_test.dart
@@ -14,16 +14,16 @@
test('should consider a package valid if it has a pubspec', () async {
await d.validPackage.create();
- expectNoValidationError((entrypoint) => PubspecValidator(entrypoint));
+ await expectValidation((entrypoint) => PubspecValidator(entrypoint));
});
- test(
- 'should consider a package invalid if it has a .gitignored '
- 'pubspec', () async {
+ test('should consider a package invalid if it has a .gitignored pubspec',
+ () async {
var repo = d.git(appPath, [d.file('.gitignore', 'pubspec.yaml')]);
await d.validPackage.create();
await repo.create();
- expectValidationError((entrypoint) => PubspecValidator(entrypoint));
+ await expectValidation((entrypoint) => PubspecValidator(entrypoint),
+ errors: isNotEmpty);
});
}
diff --git a/test/validator/readme_test.dart b/test/validator/readme_test.dart
index 7a45278..8020e1e 100644
--- a/test/validator/readme_test.dart
+++ b/test/validator/readme_test.dart
@@ -22,7 +22,7 @@
group('should consider a package valid if it', () {
test('looks normal', () async {
await d.validPackage.create();
- expectNoValidationError(readme);
+ await expectValidation(readme);
});
test('has a non-primary readme with invalid utf-8', () async {
@@ -30,7 +30,7 @@
await d.dir(appPath, [
d.file('README.x.y.z', [192])
]).create();
- expectNoValidationError(readme);
+ await expectValidation(readme);
});
test('has a gitignored README with invalid utf-8', () async {
@@ -40,7 +40,7 @@
d.file('.gitignore', 'README')
]);
await repo.create();
- expectNoValidationError(readme);
+ await expectValidation(readme);
});
});
@@ -49,13 +49,13 @@
await d.validPackage.create();
deleteEntry(p.join(d.sandbox, 'myapp/README.md'));
- expectValidationWarning(readme);
+ await expectValidation(readme, warnings: isNotEmpty);
});
test('has only a .gitignored README', () async {
await d.validPackage.create();
await d.git(appPath, [d.file('.gitignore', 'README.md')]).create();
- expectValidationWarning(readme);
+ await expectValidation(readme, warnings: isNotEmpty);
});
test('has a primary README with invalid utf-8', () async {
@@ -63,28 +63,28 @@
await d.dir(appPath, [
d.file('README', [192])
]).create();
- expectValidationWarning(readme);
+ await expectValidation(readme, warnings: isNotEmpty);
});
test('has only a non-primary readme', () async {
await d.validPackage.create();
deleteEntry(p.join(d.sandbox, 'myapp/README.md'));
await d.dir(appPath, [d.file('README.whatever')]).create();
- expectValidationWarning(readme);
+ await expectValidation(readme, warnings: isNotEmpty);
});
test('Uses only deprecated readme name .markdown', () async {
await d.validPackage.create();
deleteEntry(p.join(d.sandbox, 'myapp/README.md'));
await d.dir(appPath, [d.file('README.markdown')]).create();
- expectValidationWarning(readme);
+ await expectValidation(readme, warnings: isNotEmpty);
});
test('Uses only deprecated readme name .mdown', () async {
await d.validPackage.create();
deleteEntry(p.join(d.sandbox, 'myapp/README.md'));
await d.dir(appPath, [d.file('README.mdown')]).create();
- expectValidationWarning(readme);
+ await expectValidation(readme, warnings: isNotEmpty);
});
});
}
diff --git a/test/validator/relative_version_numbering_test.dart b/test/validator/relative_version_numbering_test.dart
new file mode 100644
index 0000000..a723706
--- /dev/null
+++ b/test/validator/relative_version_numbering_test.dart
@@ -0,0 +1,363 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import 'package:pub/src/entrypoint.dart';
+import 'package:pub/src/validator.dart';
+import 'package:pub/src/validator/relative_version_numbering.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+Validator validator(Entrypoint entrypoint) =>
+ RelativeVersionNumberingValidator(entrypoint, globalPackageServer.url);
+
+Future<void> setup({String sdkConstraint}) async {
+ await d.validPackage.create();
+ await d.dir(appPath, [
+ d.pubspec({
+ 'name': 'test_pkg',
+ 'version': '1.0.0',
+ 'environment': {'sdk': sdkConstraint},
+ }),
+ ]).create();
+
+ await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.10.0'});
+ print(await d.file('.dart_tool/package_config.json').read());
+}
+
+void main() {
+ group('should consider a package valid if it', () {
+ test('is not opting in to null-safety with previous non-null-safe version',
+ () async {
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is not opting in to null-safety with previous non-null-safe version. '
+ 'Even with a later null-safe version', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.0',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is not opting in to null-safety with previous non-null-safe version. '
+ 'Even with an in-between null-safe prerelease', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test('is opting in to null-safety with previous null-safe version',
+ () async {
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is opting in to null-safety using a pre-release of 2.10.0 '
+ 'with previous null-safe version', () async {
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0-dev <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is opting in to null-safety with previous null-safe version. '
+ 'Even with a later non-null-safe version', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is opting in to null-safety with previous null-safe version. '
+ 'Even with an in-between non-null-safe prerelease', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await expectValidation(validator);
+ });
+
+ test('is opting in to null-safety with no existing versions', () async {
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await servePackages((x) => x);
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is opting in to null-safety with no existing versions. '
+ 'Even with an in-between non-null-safe prerelease', () async {
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+ await expectValidation(validator);
+ });
+
+ test('is not opting in to null-safety with no existing versions', () async {
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await servePackages((x) => x);
+
+ await expectValidation(validator);
+ });
+
+ test(
+ 'is not opting in to null-safety with no existing versions. '
+ 'Even with an in-between null-safe prerelease', () async {
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await expectValidation(validator);
+ });
+ });
+
+ group('should warn if ', () {
+ test('opts in to null-safety, with previous version not-null-safe',
+ () async {
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await expectValidation(validator, hints: isNotEmpty);
+ });
+
+ test(
+ 'opts in to null-safety, with previous version not-null-safe. '
+ 'Even with a later null-safe version', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.0',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await expectValidation(validator, hints: isNotEmpty);
+ });
+
+ test(
+ 'opts in to null-safety, with previous version not-null-safe. '
+ 'Even with an in-between non-null-safe prerelease', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.10.0 <3.0.0');
+ await expectValidation(validator, hints: isNotEmpty);
+ });
+
+ test('is not opting in to null-safety with previous null-safe version',
+ () async {
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await expectValidation(validator, hints: isNotEmpty);
+ });
+
+ test(
+ 'is not opting in to null-safety with previous null-safe version. '
+ 'Even with a later non-null-safe version', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.0',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await expectValidation(validator, hints: isNotEmpty);
+ });
+
+ test(
+ 'is not opting in to null-safety with previous null-safe version. '
+ 'Even with an in-between not null-safe prerelease', () async {
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.10.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
+
+ await setup(sdkConstraint: '>=2.9.0 <3.0.0');
+ await expectValidation(validator, hints: isNotEmpty);
+ });
+ });
+}
diff --git a/test/validator/sdk_constraint_test.dart b/test/validator/sdk_constraint_test.dart
index d610bb8..b3296b5 100644
--- a/test/validator/sdk_constraint_test.dart
+++ b/test/validator/sdk_constraint_test.dart
@@ -19,20 +19,20 @@
group('should consider a package valid if it', () {
test('has no SDK constraint', () async {
await d.validPackage.create();
- expectNoValidationError(sdkConstraint);
+ await expectValidation(sdkConstraint);
});
test('has an SDK constraint without ^', () async {
await d.dir(appPath,
[d.libPubspec('test_pkg', '1.0.0', sdk: '>=1.8.0 <2.0.0')]).create();
- expectNoValidationError(sdkConstraint);
+ await expectValidation(sdkConstraint);
});
test('depends on a pre-release Dart SDK from a pre-release', () async {
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0-dev.1', sdk: '>=1.8.0-dev.1 <2.0.0')
]).create();
- expectNoValidationError(sdkConstraint);
+ await expectValidation(sdkConstraint);
});
test(
@@ -45,7 +45,7 @@
'environment': {'sdk': '>=1.19.0 <2.0.0', 'flutter': '^1.2.3'}
})
]).create();
- expectNoValidationError(sdkConstraint);
+ await expectValidation(sdkConstraint);
});
test(
@@ -58,7 +58,7 @@
'environment': {'sdk': '>=2.0.0-dev.51.0 <2.0.0', 'fuchsia': '^1.2.3'}
})
]).create();
- expectNoValidationError(sdkConstraint);
+ await expectValidation(sdkConstraint);
});
});
@@ -66,29 +66,23 @@
test('has an SDK constraint with ^', () async {
await d.dir(
appPath, [d.libPubspec('test_pkg', '1.0.0', sdk: '^1.8.0')]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(
- pairOf(anyElement(contains('">=1.8.0 <2.0.0"')), isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors: anyElement(contains('">=1.8.0 <2.0.0"')));
});
test('has no upper bound SDK constraint', () async {
await d.dir(appPath,
[d.libPubspec('test_pkg', '1.0.0', sdk: '>=1.8.0')]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(pairOf(
- anyElement(contains('should have an upper bound constraint')),
- isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors:
+ anyElement(contains('should have an upper bound constraint')));
});
test('has no SDK constraint', () async {
await d.dir(appPath, [d.libPubspec('test_pkg', '1.0.0')]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(pairOf(
- anyElement(contains('should have an upper bound constraint')),
- isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors:
+ anyElement(contains('should have an upper bound constraint')));
});
test(
@@ -101,10 +95,8 @@
'environment': {'sdk': '>=1.18.0 <1.50.0', 'flutter': '^1.2.3'}
})
]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(
- pairOf(anyElement(contains('">=1.19.0 <1.50.0"')), isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors: anyElement(contains('">=1.19.0 <1.50.0"')));
});
test('has a Flutter SDK constraint with no SDK constraint', () async {
@@ -115,10 +107,8 @@
'environment': {'flutter': '^1.2.3'}
})
]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(
- pairOf(anyElement(contains('">=1.19.0 <2.0.0"')), isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors: anyElement(contains('">=1.19.0 <2.0.0"')));
});
test(
@@ -131,10 +121,8 @@
'environment': {'sdk': '>=2.0.0-dev.50.0 <2.0.0', 'fuchsia': '^1.2.3'}
})
]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(
- pairOf(anyElement(contains('">=2.0.0 <3.0.0"')), isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors: anyElement(contains('">=2.0.0 <3.0.0"')));
});
test('has a Fuchsia SDK constraint with no SDK constraint', () async {
@@ -145,26 +133,17 @@
'environment': {'fuchsia': '^1.2.3'}
})
]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(
- pairOf(anyElement(contains('">=2.0.0 <3.0.0"')), isEmpty)));
+ await expectValidation(sdkConstraint,
+ errors: anyElement(contains('">=2.0.0 <3.0.0"')));
});
test('depends on a pre-release sdk from a non-pre-release', () async {
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0', sdk: '>=1.8.0-dev.1 <2.0.0')
]).create();
- expect(
- validatePackage(sdkConstraint),
- completion(
- pairOf(
- isEmpty,
- anyElement(contains(
- 'consider publishing the package as a pre-release instead')),
- ),
- ),
- );
+ await expectValidation(sdkConstraint,
+ warnings: anyElement(contains(
+ 'consider publishing the package as a pre-release instead')));
});
});
}
diff --git a/test/validator/size_test.dart b/test/validator/size_test.dart
index 838b082..59a967f 100644
--- a/test/validator/size_test.dart
+++ b/test/validator/size_test.dart
@@ -17,17 +17,19 @@
return (entrypoint) => SizeValidator(entrypoint, Future.value(size));
}
-void expectSizeValidationError(Matcher matcher) {
- expect(validatePackage(size(100 * math.pow(2, 20) + 1)),
- completion(pairOf(contains(matcher), anything)));
+Future<void> expectSizeValidationError(Matcher matcher) async {
+ await expectValidation(
+ size(100 * math.pow(2, 20) + 1),
+ errors: contains(matcher),
+ );
}
void main() {
test('considers a package valid if it is <= 100 MB', () async {
await d.validPackage.create();
- expectNoValidationError(size(100));
- expectNoValidationError(size(100 * math.pow(2, 20)));
+ await expectValidation(size(100));
+ await expectValidation(size(100 * math.pow(2, 20)));
});
group('considers a package invalid if it is more than 100 MB', () {
@@ -35,7 +37,7 @@
() async {
await d.validPackage.create();
- expectSizeValidationError(
+ await expectSizeValidationError(
equals('Your package is 100.0 MB. Hosted packages must '
'be smaller than 100 MB.'));
});
@@ -44,7 +46,7 @@
await d.validPackage.create();
await d.dir(appPath, [d.file('.gitignore', 'ignored')]).create();
- expectSizeValidationError(allOf(
+ await expectSizeValidationError(allOf(
contains('Hosted packages must be smaller than 100 MB.'),
contains('Your .gitignore has no effect since your project '
'does not appear to be in version control.')));
@@ -54,7 +56,7 @@
await d.validPackage.create();
await d.git(appPath).create();
- expectSizeValidationError(allOf(
+ await expectSizeValidationError(allOf(
contains('Hosted packages must be smaller than 100 MB.'),
contains('Consider adding a .gitignore to avoid including '
'temporary files.')));
@@ -64,7 +66,7 @@
await d.validPackage.create();
await d.git(appPath, [d.file('.gitignore', 'ignored')]).create();
- expectSizeValidationError(
+ await expectSizeValidationError(
equals('Your package is 100.0 MB. Hosted packages must '
'be smaller than 100 MB.'));
});
diff --git a/test/validator/strict_dependencies_test.dart b/test/validator/strict_dependencies_test.dart
index 3c7d649..9a68b46 100644
--- a/test/validator/strict_dependencies_test.dart
+++ b/test/validator/strict_dependencies_test.dart
@@ -19,7 +19,7 @@
group('should consider a package valid if it', () {
setUp(d.validPackage.create);
- test('looks normal', () => expectNoValidationError(strictDeps));
+ test('looks normal', () => expectValidation(strictDeps));
test('declares an "import" as a dependency in lib/', () async {
await d.dir(appPath, [
@@ -32,7 +32,7 @@
]),
]).create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('declares an "export" as a dependency in lib/', () async {
@@ -46,7 +46,7 @@
]),
]).create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('declares an "import" as a dependency in bin/', () async {
@@ -60,7 +60,7 @@
]),
]).create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
for (var port in ['import', 'export']) {
@@ -87,7 +87,7 @@
]),
]).create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
}
}
@@ -100,7 +100,7 @@
import 'dart:typed_data';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('imports itself', () async {
@@ -108,7 +108,7 @@
import 'package:test_pkg/test_pkg.dart';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('has a relative import', () async {
@@ -116,7 +116,7 @@
import 'some/relative/path.dart';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('has an absolute import', () async {
@@ -124,7 +124,7 @@
import 'file://shared/some/library.dart';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('has a parse error preventing reading directives', () async {
@@ -132,7 +132,7 @@
import not_supported_keyword 'dart:async';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('has a top-level Dart file with an invalid dependency', () async {
@@ -140,7 +140,7 @@
import 'package:';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('has a Dart-like file with an invalid dependency', () async {
@@ -148,7 +148,7 @@
import 'package:';
''').create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
test('has analysis_options.yaml that excludes files', () async {
@@ -178,7 +178,7 @@
'''),
]).create();
- expectNoValidationError(strictDeps);
+ await expectValidation(strictDeps);
});
});
@@ -190,7 +190,7 @@
import 'package:silly_monkey/silly_monkey.dart';
''').create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
test('does not declare an "export" as a dependency', () async {
@@ -198,7 +198,7 @@
export 'package:silly_monkey/silly_monkey.dart';
''').create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
test('has an invalid URI', () async {
@@ -206,7 +206,7 @@
import 'package:/';
''').create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
for (var port in ['import', 'export']) {
@@ -222,7 +222,7 @@
]),
]).create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
}
}
@@ -240,7 +240,7 @@
]),
]).create();
- expectValidationWarning(strictDeps);
+ await expectValidation(strictDeps, warnings: isNotEmpty);
});
}
}
@@ -255,7 +255,7 @@
]),
]).create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
test('"package:silly_monkey"', () async {
@@ -269,7 +269,7 @@
]),
]).create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
test('"package:/"', () async {
@@ -281,7 +281,7 @@
]),
]).create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
test('"package:/]"', () async {
@@ -293,7 +293,7 @@
]),
]).create();
- expectValidationError(strictDeps);
+ await expectValidation(strictDeps, errors: isNotEmpty);
});
});
});
diff --git a/test/validator/utils.dart b/test/validator/utils.dart
index aae403a..6e3a0e3 100644
--- a/test/validator/utils.dart
+++ b/test/validator/utils.dart
@@ -6,14 +6,10 @@
import '../test_pub.dart';
-void expectNoValidationError(ValidatorCreator fn) {
- expect(validatePackage(fn), completion(pairOf(isEmpty, isEmpty)));
-}
-
-void expectValidationError(ValidatorCreator fn) {
- expect(validatePackage(fn), completion(pairOf(isNot(isEmpty), anything)));
-}
-
-void expectValidationWarning(ValidatorCreator fn) {
- expect(validatePackage(fn), completion(pairOf(isEmpty, isNot(isEmpty))));
+Future<void> expectValidation(ValidatorCreator fn,
+ {hints, warnings, errors}) async {
+ final validator = await validatePackage(fn);
+ expect(validator.errors, errors ?? isEmpty);
+ expect(validator.warnings, warnings ?? isEmpty);
+ expect(validator.hints, hints ?? isEmpty);
}