blob: f2da266bcb09cfbd06cf6ed44a58b2c1fd647b99 [file] [log] [blame]
// Copyright (c) 2021, 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.
// @dart=2.10
import 'package:http/http.dart' as http;
import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:shelf/shelf.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
import '../test_pub.dart';
void main() {
forBothPubGetAndUpgrade((command) {
test('does not require slash on bare domain', () async {
await servePackages((b) => b..serve('foo', '1.2.3'));
// All the tests in this file assumes that [globalPackageServer.url]
// will be on the form:
// http://localhost:<port>
// In particular, that it doesn't contain anything path segment.
expect(Uri.parse(globalPackageServer.url).path, isEmpty);
await d.dir(appPath, [
d.appPubspec({
'foo': {
'hosted': {'name': 'foo', 'url': globalPackageServer.url},
},
}),
]).create();
await pubCommand(
command,
silent: contains('${globalPackageServer.url}/api/packages/foo'),
);
});
test('normalizes extra slash', () async {
await servePackages((b) => b..serve('foo', '1.2.3'));
await d.dir(appPath, [
d.appPubspec({
'foo': {
'hosted': {'name': 'foo', 'url': globalPackageServer.url + '/'},
},
}),
]).create();
await pubCommand(
command,
silent: contains('${globalPackageServer.url}/api/packages/foo'),
);
});
test('cannot normalize double slash', () async {
await servePackages((b) => b..serve('foo', '1.2.3'));
globalPackageServer.expect(
'GET',
'//api/packages/foo',
(request) => Response.notFound(''),
);
await d.dir(appPath, [
d.appPubspec({
'foo': {
'hosted': {'name': 'foo', 'url': globalPackageServer.url + '//'},
},
}),
]).create();
await pubCommand(
command,
error: contains(
'could not find package foo at ${globalPackageServer.url}//'),
exitCode: exit_codes.UNAVAILABLE,
);
});
/// Proxy request for '/my-folder/...' -> '/...'
///
/// This is a bit of a hack, to easily test if hosted pub URLs with a path
/// segment works and if the slashes are normalized.
void _proxyMyFolderToRoot() {
globalPackageServer.extraHandlers[RegExp('/my-folder/.*')] = (r) async {
if (r.method != 'GET' && r.method != 'HEAD') {
return Response.forbidden(null);
}
final path = r.requestedUri.path.substring('/my-folder/'.length);
final res = await http.get(
Uri.parse(globalPackageServer.url + '/$path'),
);
return Response(res.statusCode, body: res.bodyBytes, headers: {
'Content-Type': res.headers['Content-Type'],
});
};
}
test('will use normalized url with path', () async {
await servePackages((b) => b..serve('foo', '1.2.3'));
_proxyMyFolderToRoot();
// testing with a normalized URL
final testUrl = globalPackageServer.url + '/my-folder/';
final normalizedUrl = globalPackageServer.url + '/my-folder/';
await d.dir(appPath, [
d.appPubspec({
'foo': {
'hosted': {'name': 'foo', 'url': testUrl},
},
}),
]).create();
await pubCommand(command);
await d.dir(appPath, [
d.file('pubspec.lock', contains('"$normalizedUrl"')),
]).validate();
});
test('will normalize url with path by adding slash', () async {
await servePackages((b) => b..serve('foo', '1.2.3'));
_proxyMyFolderToRoot();
// Testing with a URL that is missing the slash.
final testUrl = globalPackageServer.url + '/my-folder';
final normalizedUrl = globalPackageServer.url + '/my-folder/';
await d.dir(appPath, [
d.appPubspec({
'foo': {
'hosted': {'name': 'foo', 'url': testUrl},
},
}),
]).create();
await pubCommand(command);
await d.dir(appPath, [
d.file('pubspec.lock', contains('"$normalizedUrl"')),
]).validate();
});
});
}