| // 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. | |
| @TestOn('vm') | |
| library; | |
| import 'dart:io' show File; | |
| import 'package:pub/src/path.dart'; | |
| import 'package:test/test.dart'; | |
| import '../descriptor.dart' as d; | |
| import '../test_pub.dart'; | |
| void main() { | |
| test('removes a package from dependencies', () async { | |
| final server = await servePackages(); | |
| server.serve('foo', '1.2.3'); | |
| await d.appDir(dependencies: {'foo': '1.2.3'}).create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo']); | |
| await d.cacheDir({}).validate(); | |
| await d.appPackageConfigFile([]).validate(); | |
| await d.appDir().validate(); | |
| }); | |
| test( | |
| 'removing a package from dependencies does not affect dev_dependencies', | |
| () async { | |
| await servePackages() | |
| ..serve('foo', '1.2.3') | |
| ..serve('foo', '1.2.2') | |
| ..serve('bar', '2.0.0'); | |
| await d.dir(appPath, [ | |
| d.file('pubspec.yaml', ''' | |
| name: myapp | |
| dependencies: | |
| foo: 1.2.3 | |
| dev_dependencies: | |
| bar: 2.0.0 | |
| environment: | |
| sdk: '$defaultSdkConstraint' | |
| '''), | |
| ]).create(); | |
| await pubRemove(args: ['foo']); | |
| await d.cacheDir({'bar': '2.0.0'}).validate(); | |
| await d.appPackageConfigFile([ | |
| d.packageConfigEntry(name: 'bar', version: '2.0.0'), | |
| ]).validate(); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'myapp', | |
| 'dev_dependencies': {'bar': '2.0.0'}, | |
| }), | |
| ]).validate(); | |
| }, | |
| ); | |
| test('dry-run does not actually remove dependency', () async { | |
| final server = await servePackages(); | |
| server.serve('foo', '1.2.3'); | |
| await d.appDir(dependencies: {'foo': '1.2.3'}).create(); | |
| await pubGet(); | |
| await pubRemove( | |
| args: ['foo', '--dry-run'], | |
| output: allOf([ | |
| contains('These packages are no longer being depended on:'), | |
| contains('- foo 1.2.3'), | |
| ]), | |
| ); | |
| await d.appDir(dependencies: {'foo': '1.2.3'}).validate(); | |
| }); | |
| test('prints a warning if package does not exist', () async { | |
| await d.appDir().create(); | |
| await pubRemove( | |
| args: ['foo'], | |
| warning: contains('Package "foo" was not found in pubspec.yaml!'), | |
| ); | |
| await d.appDir().validate(); | |
| }); | |
| test('prints a warning if the dependencies map does not exist', () async { | |
| await d.dir(appPath, [ | |
| d.pubspec({'name': 'myapp'}), | |
| ]).create(); | |
| await pubRemove( | |
| args: ['foo'], | |
| warning: contains('Package "foo" was not found in pubspec.yaml!'), | |
| ); | |
| await d.dir(appPath, [ | |
| d.pubspec({'name': 'myapp'}), | |
| ]).validate(); | |
| }); | |
| test('removes a package from dev_dependencies', () async { | |
| final server = await servePackages(); | |
| server.serve('foo', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'myapp', | |
| 'dev_dependencies': {'foo': '1.2.3'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo']); | |
| await d.cacheDir({}).validate(); | |
| await d.appPackageConfigFile([]).validate(); | |
| await d.dir(appPath, [ | |
| d.pubspec({'name': 'myapp'}), | |
| ]).validate(); | |
| }); | |
| test( | |
| 'removes multiple packages from dependencies and dev_dependencies', | |
| () async { | |
| await servePackages() | |
| ..serve('foo', '1.2.3') | |
| ..serve('bar', '2.3.4') | |
| ..serve('baz', '3.2.1') | |
| ..serve('jfj', '0.2.1'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'myapp', | |
| 'dependencies': {'bar': '>=2.3.4', 'jfj': '0.2.1'}, | |
| 'dev_dependencies': {'foo': '^1.2.3', 'baz': '3.2.1'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo', 'bar', 'baz']); | |
| await d.cacheDir({'jfj': '0.2.1'}).validate(); | |
| await d.appPackageConfigFile([ | |
| d.packageConfigEntry(name: 'jfj', version: '0.2.1'), | |
| ]).validate(); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'myapp', | |
| 'dependencies': {'jfj': '0.2.1'}, | |
| }), | |
| ]).validate(); | |
| }, | |
| ); | |
| test('removes git dependencies', () async { | |
| final server = await servePackages(); | |
| server.serve('bar', '1.2.3'); | |
| ensureGit(); | |
| final repo = d.git('foo.git', [ | |
| d.dir('subdir', [d.libPubspec('foo', '1.0.0'), d.libDir('foo', '1.0.0')]), | |
| ]); | |
| await repo.create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'git': {'url': '../foo.git', 'path': 'subdir'}, | |
| }, | |
| 'bar': '1.2.3', | |
| }, | |
| ) | |
| .create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo']); | |
| await d.appPackageConfigFile([ | |
| d.packageConfigEntry(name: 'bar', version: '1.2.3'), | |
| ]).validate(); | |
| await d.appDir(dependencies: {'bar': '1.2.3'}).validate(); | |
| }); | |
| test('removes path dependencies', () async { | |
| final server = await servePackages(); | |
| server.serve('bar', '1.2.3'); | |
| await d.dir('foo', [ | |
| d.libDir('foo'), | |
| d.libPubspec('foo', '0.0.1'), | |
| ]).create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': {'path': '../foo'}, | |
| 'bar': '1.2.3', | |
| }, | |
| ) | |
| .create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo']); | |
| await d.appPackageConfigFile([ | |
| d.packageConfigEntry(name: 'bar', version: '1.2.3'), | |
| ]).validate(); | |
| await d.appDir(dependencies: {'bar': '1.2.3'}).validate(); | |
| }); | |
| test('removes hosted dependencies', () async { | |
| final server = await servePackages(); | |
| server.serve('bar', '2.0.1'); | |
| final custom = await startPackageServer(); | |
| custom.serve('foo', '1.2.3'); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'version': '1.2.3', | |
| 'hosted': { | |
| 'name': 'foo', | |
| 'url': 'http://localhost:${custom.port}', | |
| }, | |
| }, | |
| 'bar': '2.0.1', | |
| }, | |
| ) | |
| .create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo']); | |
| await d.appPackageConfigFile([ | |
| d.packageConfigEntry(name: 'bar', version: '2.0.1'), | |
| ]).validate(); | |
| await d.appDir(dependencies: {'bar': '2.0.1'}).validate(); | |
| }); | |
| test('removes overrides', () async { | |
| final server = await servePackages(); | |
| server.serve('foo', '1.0.0', deps: {'bar': '1.0.0'}); | |
| server.serve('bar', '1.0.0'); | |
| server.serve('bar', '2.0.0'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'myapp', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| 'dev_dependencies': {'bar': '^2.0.0'}, | |
| 'dependency_overrides': {'bar': '1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| // Cannot remove the constraint on bar, would create conflict. | |
| await pubRemove( | |
| args: ['override:bar'], | |
| error: contains('version solving failed.'), | |
| exitCode: 1, | |
| ); | |
| await pubRemove(args: ['override:bar', 'foo']); | |
| await d.appPackageConfigFile([ | |
| d.packageConfigEntry(name: 'bar', version: '2.0.0'), | |
| ]).validate(); | |
| }); | |
| test('preserves comments', () async { | |
| await servePackages() | |
| ..serve('bar', '1.0.0') | |
| ..serve('foo', '1.0.0'); | |
| await d.dir(appPath, [ | |
| d.file('pubspec.yaml', ''' | |
| name: myapp | |
| dependencies: # comment A | |
| # comment B | |
| bar: 1.0.0 | |
| # comment C | |
| foo: 1.0.0 # comment D | |
| # comment E | |
| environment: | |
| sdk: '$defaultSdkConstraint' | |
| '''), | |
| ]).create(); | |
| await pubGet(); | |
| await pubRemove(args: ['bar']); | |
| await d.appDir(dependencies: {'foo': '1.0.0'}).validate(); | |
| final fullPath = p.join(d.sandbox, appPath, 'pubspec.yaml'); | |
| expect(File(fullPath).existsSync(), true); | |
| final contents = File(fullPath).readAsStringSync(); | |
| expect( | |
| contents, | |
| allOf([ | |
| contains('# comment A'), | |
| contains('# comment B'), | |
| contains('# comment C'), | |
| contains('# comment D'), | |
| contains('# comment E'), | |
| ]), | |
| ); | |
| }); | |
| test('removes dependencies or dev_dependencies key if empty', () async { | |
| await servePackages() | |
| ..serve('foo', '1.2.3') | |
| ..serve('bar', '2.3.4'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'myapp', | |
| 'dependencies': {'bar': '>=2.3.4'}, | |
| 'dev_dependencies': {'foo': '^1.2.3'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| await pubRemove(args: ['foo', 'bar']); | |
| await d.appPackageConfigFile([]).validate(); | |
| await d.dir(appPath, [ | |
| d.pubspec({'name': 'myapp'}), | |
| ]).validate(); | |
| }); | |
| } |