|  | // Copyright (c) 2024, 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:io'; | 
|  |  | 
|  | import 'package:path/path.dart' as p; | 
|  | import 'package:pub/src/exit_codes.dart'; | 
|  | import 'package:test/test.dart'; | 
|  |  | 
|  | import 'descriptor.dart' as d; | 
|  | import 'test_pub.dart'; | 
|  |  | 
|  | final s = Platform.pathSeparator; | 
|  |  | 
|  | void main() { | 
|  | test('handles errors', () async { | 
|  | await d.dir(appPath).create(); | 
|  | final server = await servePackages(); | 
|  | server.serve('foo', '1.2.3'); | 
|  | await runPub( | 
|  | args: ['unpack', 'foo:1:2:3'], | 
|  | error: contains( | 
|  | 'Error on line 1, column 1 of descriptor: Invalid version constraint: ' | 
|  | 'Could not parse version "1:2:3". Unknown text at "1:2:3".', | 
|  | ), | 
|  | exitCode: DATA, | 
|  | ); | 
|  |  | 
|  | await runPub( | 
|  | args: ['unpack', 'foo:1.0'], | 
|  | error: 'Error on line 1, column 1 of descriptor: ' | 
|  | 'A dependency specification must be a string or a mapping.', | 
|  | exitCode: DATA, | 
|  | ); | 
|  |  | 
|  | await runPub( | 
|  | args: ['unpack', 'foo'], | 
|  | ); | 
|  | await runPub( | 
|  | args: ['unpack', 'foo'], | 
|  | error: 'Target directory `.${s}foo-1.2.3` already exists. ' | 
|  | 'Use --force to overwrite.', | 
|  | exitCode: 1, | 
|  | ); | 
|  | await runPub(args: ['unpack', 'foo', '--force']); | 
|  | }); | 
|  |  | 
|  | test('Chooses right version to unpack', () async { | 
|  | await d.dir(appPath).create(); | 
|  | final server = await servePackages(); | 
|  | server.serve('foo', '0.1.1'); | 
|  | server.serve('foo', '0.1.0'); | 
|  | server.serve( | 
|  | 'foo', | 
|  | '1.2.3', | 
|  | contents: [ | 
|  | d.dir('example', [ | 
|  | d.pubspec({ | 
|  | 'name': 'example', | 
|  | 'dependencies': { | 
|  | 'foo': {'path': '..'}, | 
|  | }, | 
|  | }), | 
|  | ]), | 
|  | ], | 
|  | ); | 
|  | server.serve('foo', '1.2.3-pre'); | 
|  | await d.appDir().create(); | 
|  |  | 
|  | await runPub( | 
|  | args: ['unpack', 'foo'], | 
|  | output: allOf( | 
|  | contains(''' | 
|  | Downloading foo 1.2.3 to `.${s}foo-1.2.3`... | 
|  | Resolving dependencies in `.${s}foo-1.2.3`... | 
|  | '''), | 
|  | contains('To explore type: cd .${s}foo-1.2.3'), | 
|  | contains( | 
|  | 'To explore the example type: cd .${s}foo-1.2.3${s}example', | 
|  | ), | 
|  | ), | 
|  | ); | 
|  |  | 
|  | expect( | 
|  | File(p.join(d.sandbox, appPath, 'foo-1.2.3', 'pubspec.yaml')) | 
|  | .existsSync(), | 
|  | isTrue, | 
|  | ); | 
|  | expect( | 
|  | File(p.join(d.sandbox, appPath, 'foo-1.2.3', 'example', 'pubspec.yaml')) | 
|  | .existsSync(), | 
|  | isTrue, | 
|  | ); | 
|  |  | 
|  | await runPub( | 
|  | args: ['unpack', 'foo:1.2.3-pre', '--output=../'], | 
|  | output: allOf( | 
|  | contains(''' | 
|  | Downloading foo 1.2.3-pre to `../foo-1.2.3-pre`... | 
|  | Resolving dependencies in `../foo-1.2.3-pre`... | 
|  | '''), | 
|  | contains('To explore type: cd ../foo-1.2.3-pre'), | 
|  | ), | 
|  | ); | 
|  |  | 
|  | expect( | 
|  | File(p.join(d.sandbox, 'foo-1.2.3-pre', 'pubspec.yaml')).existsSync(), | 
|  | isTrue, | 
|  | ); | 
|  |  | 
|  | await runPub( | 
|  | args: ['unpack', 'foo:^0.1.0'], | 
|  | output: contains('Downloading foo 0.1.1 to `.${s}foo-0.1.1`...'), | 
|  | ); | 
|  | }); | 
|  |  | 
|  | test('unpack from third party package repository', () async { | 
|  | await d.dir(appPath).create(); | 
|  | final server = await startPackageServer(); | 
|  | server.serve('foo', '1.0.0'); | 
|  | server.serve('foo', '1.2.3'); | 
|  | await runPub( | 
|  | args: ['unpack', 'foo:{"hosted":"${server.url}", "version":"1.0.0"}'], | 
|  | output: contains('Downloading foo 1.0.0 to `.${s}foo-1.0.0`...'), | 
|  | ); | 
|  | }); | 
|  | } |