blob: 39cb66febeff997cb39b8af4f2382471172fcfd3 [file] [log] [blame]
// Copyright (c) 2012, 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:shelf/shelf.dart';
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart';
import 'descriptor.dart' as d;
import 'test_pub.dart';
void main() {
test('suggests an upgrade to the flutter sdk', () async {
await d.dir('flutter', [d.flutterVersion('1.2.3')]).create();
final server = await servePackages();
server.serve(
'foo',
'1.0.0',
pubspec: {
'environment': {'flutter': '>=3.3.0', 'sdk': '^2.17.0'},
},
);
server.handle(
'/flutterReleases',
(request) => Response.ok(releasesMockResponse),
);
await d.dir(appPath, [
d.libPubspec('myApp', '1.0.0', deps: {'foo': 'any'}, sdk: '^2.17.0'),
]).create();
await pubGet(
error: contains('* Try using the Flutter SDK version: 3.3.2.'),
environment: {
'_PUB_TEST_SDK_VERSION': '2.17.0',
'FLUTTER_ROOT': path('flutter'),
'_PUB_TEST_FLUTTER_RELEASES_URL': '${server.url}/flutterReleases',
'PUB_ENVIRONMENT': 'flutter_cli',
},
);
});
test('suggests an upgrade to the dart sdk', () async {
final server = await servePackages();
server.serve(
'foo',
'1.0.0',
pubspec: {
'environment': {'sdk': '>=2.18.0 <2.18.1'},
},
);
server.handle(
'/flutterReleases',
(request) => Response.ok(releasesMockResponse),
);
await d.dir(appPath, [
d.libPubspec('myApp', '1.0.0', deps: {'foo': 'any'}, sdk: '^2.17.0'),
]).create();
await pubGet(
error: contains('* Try using the Dart SDK version: 2.18.0'),
environment: {
'_PUB_TEST_SDK_VERSION': '2.17.0',
'_PUB_TEST_FLUTTER_RELEASES_URL': '${server.url}/flutterReleases',
},
);
});
test('suggests an upgrade or downgrade to a package constraint', () async {
final server = await servePackages();
server.serve('foo', '1.0.0', deps: {'bar': '^2.0.0'});
server.serve('foo', '0.9.0', deps: {'bar': '^1.0.0'});
server.serve('bar', '1.0.0');
server.serve('bar', '2.0.0');
await d.dir(appPath, [
d.libPubspec(
'myApp',
'1.0.0',
deps: {'foo': '^1.0.0'},
devDeps: {'bar': '^1.0.0'},
),
]).create();
await pubGet(
error: allOf(
[
contains(
'* Consider downgrading your constraint on foo: dart pub add foo:^0.9.0',
),
contains(
'* Try upgrading your constraint on bar: dart pub add dev:bar:^2.0.0',
),
],
),
);
});
test('suggests an update to an empty package constraint', () async {
final server = await servePackages();
server.serve('foo', '1.0.0');
await d.dir(appPath, [
d.libPubspec(
'myApp',
'1.0.0',
deps: {'foo': '>1.0.0 <=0.0.0'},
),
]).create();
await pubGet(
error: allOf(
[
contains(
'* Try updating your constraint on foo: dart pub add foo:^1.0.0',
),
],
),
);
});
test('suggests updates to multiple packages', () async {
final server = await servePackages();
server.serve('foo', '1.0.0', deps: {'bar': '2.0.0'});
server.serve('bar', '1.0.0', deps: {'foo': '2.0.0'});
server.serve('foo', '2.0.0', deps: {'bar': '2.0.0'});
server.serve('bar', '2.0.0', deps: {'foo': '2.0.0'});
await d.dir(appPath, [
d.libPubspec(
'myApp',
'1.0.0',
deps: {'foo': '1.0.0'},
devDeps: {'bar': '1.0.0'},
),
]).create();
await pubGet(
error: contains(
'* Try updating the following constraints: dart pub add dev:bar:^2.0.0 foo:^2.0.0',
),
);
});
test('suggests a major upgrade if more than 5 needs to be upgraded',
() async {
final server = await servePackages();
server.serve('foo', '1.0.0', deps: {'bar': '2.0.0'});
server.serve('bar', '1.0.0', deps: {'foo': '2.0.0'});
server.serve('foo', '2.0.0', deps: {'bar': '2.0.0'});
server.serve('bar', '2.0.0', deps: {'foo': '2.0.0'});
server.serve('foo1', '1.0.0', deps: {'bar1': '2.0.0'});
server.serve('bar1', '1.0.0', deps: {'foo1': '2.0.0'});
server.serve('foo1', '2.0.0', deps: {'bar1': '2.0.0'});
server.serve('bar1', '2.0.0', deps: {'foo1': '2.0.0'});
server.serve('foo2', '1.0.0', deps: {'bar2': '2.0.0'});
server.serve('bar2', '1.0.0', deps: {'foo2': '2.0.0'});
server.serve('foo2', '2.0.0', deps: {'bar2': '2.0.0'});
server.serve('bar2', '2.0.0', deps: {'foo2': '2.0.0'});
await d.dir(appPath, [
d.libPubspec(
'myApp',
'1.0.0',
deps: {
'foo': '1.0.0',
'bar': '1.0.0',
'foo1': '1.0.0',
'bar1': '1.0.0',
'foo2': '1.0.0',
'bar2': '1.0.0',
},
),
]).create();
await pubGet(
error: contains(
'* Try an upgrade of your constraints: dart pub upgrade --major-versions',
),
);
});
test('suggests upgrades to non-default servers', () async {
final server = await servePackages();
final server2 = await startPackageServer();
server.serve(
'foo',
'1.0.0',
deps: {
'bar': {'version': '2.0.0', 'hosted': server2.url},
},
);
server2.serve('bar', '1.0.0');
server2.serve('bar', '2.0.0');
await d.dir(appPath, [
d.libPubspec(
'myApp',
'1.0.0',
deps: {
'foo': '^1.0.0',
'bar': {'version': '^1.0.0', 'hosted': server2.url},
},
),
]).create();
await pubGet(
error: contains(
'* Try upgrading your constraint on bar: dart pub add '
'bar:\'{"version":"^2.0.0","hosted":"${server2.url}"}\'',
),
);
await pubAdd(
args: ['bar:{"version":"^2.0.0","hosted":"${server2.url}"}'],
);
await d.dir(appPath, [
d.libPubspec(
'myApp',
'1.0.0',
deps: {
'foo': '^1.0.0',
'bar': {'version': '^2.0.0', 'hosted': server2.url},
},
),
]).validate();
});
}
const releasesMockResponse = '''
{
"base_url": "https://storage.googleapis.com/flutter_infra_release/releases",
"current_release": {
"beta": "096162697a9cdc79f4e47f7230d70935fa81fd24",
"dev": "13a2fb10b838971ce211230f8ffdd094c14af02c",
"stable": "e3c29ec00c9c825c891d75054c63fcc46454dca1"
},
"releases": [
{
"hash": "e3c29ec00c9c825c891d75054c63fcc46454dca1",
"channel": "stable",
"version": "3.3.2",
"dart_sdk_version": "2.18.1",
"dart_sdk_arch": "x64",
"release_date": "2022-09-14T15:06:55.724077Z",
"archive": "stable/linux/flutter_linux_3.3.2-stable.tar.xz",
"sha256": "a733a75ae07c42b2059a31fc9d64fabfae5dccd15770fa6b7f290e3f5f9c98e8"
},
{
"hash": "4f9d92fbbdf072a70a70d2179a9f87392b94104c",
"channel": "stable",
"version": "3.3.1",
"dart_sdk_version": "2.18.0",
"dart_sdk_arch": "x64",
"release_date": "2022-09-07T15:30:42.283999Z",
"archive": "stable/linux/flutter_linux_3.3.1-stable.tar.xz",
"sha256": "7cbcff0230affbe07a5ce82298044ac437e96aeba69f83656f9ed9a910a392e7"
},
{
"hash": "ffccd96b62ee8cec7740dab303538c5fc26ac543",
"channel": "stable",
"version": "3.3.0",
"dart_sdk_version": "2.18.0",
"dart_sdk_arch": "x64",
"release_date": "2022-08-30T17:22:12.916008Z",
"archive": "stable/linux/flutter_linux_3.3.0-stable.tar.xz",
"sha256": "a92a27aa6d4454d7a1cf9f8a0a56e0e5d6865f2cfcd21cf52e57f7922ad5d504"
},
{
"hash": "096162697a9cdc79f4e47f7230d70935fa81fd24",
"channel": "beta",
"version": "3.3.0-0.5.pre",
"dart_sdk_version": "2.18.0 (build 2.18.0-271.7.beta)",
"dart_sdk_arch": "x64",
"release_date": "2022-08-23T17:03:21.525151Z",
"archive": "beta/linux/flutter_linux_3.3.0-0.5.pre-beta.tar.xz",
"sha256": "8e07158a64a8ce79f9169cffe4ff23a486bdabb29401f13177672fae18de52d2"
}
]
}
''';