|  | // 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" | 
|  | } | 
|  | ] | 
|  | } | 
|  | '''; |