blob: d341df479655d8486eebc89ba570a8378eb8c31e [file] [log] [blame]
// 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.
// @dart=2.10
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
import '../golden_file.dart';
import '../test_pub.dart';
Future<void> pipeline(String name, List<_PackageVersion> upgrades) async {
final buffer = StringBuffer();
await runPubIntoBuffer([
'__experimental-dependency-services',
'list',
], buffer);
await runPubIntoBuffer([
'__experimental-dependency-services',
'report',
], buffer);
final input = json.encode({
'changes': upgrades,
});
await runPubIntoBuffer([
'__experimental-dependency-services',
'apply',
], buffer, stdin: input);
void catIntoBuffer(String path) {
buffer.writeln('$path:');
buffer.writeln(File(p.join(d.sandbox, path)).readAsStringSync());
}
catIntoBuffer(p.join(appPath, 'pubspec.yaml'));
catIntoBuffer(p.join(appPath, 'pubspec.lock'));
expectMatchesGoldenFile(
// TODO: Consider if expectMatchesGoldenFile should replace localhost:<port>
buffer.toString().replaceAll(RegExp('localhost:\d+'), 'localhost:<port>'),
'test/dependency_services/goldens/dependency_report_$name.txt',
);
}
Future<void> main() async {
test('Removing transitive', () async {
await servePackages((builder) => builder
..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'})
..serve('foo', '2.2.3')
..serve('transitive', '1.0.0'));
await d.dir(appPath, [
d.pubspec({
'name': 'app',
'dependencies': {
'foo': '^1.0.0',
},
})
]).create();
await pubGet();
await pipeline('removing_transitive', [
_PackageVersion('foo', Version.parse('2.2.3')),
_PackageVersion('transitive', null)
]);
});
test('Adding transitive', () async {
await servePackages((builder) => builder
..serve('foo', '1.2.3')
..serve('foo', '2.2.3', deps: {'transitive': '^1.0.0'})
..serve('transitive', '1.0.0'));
await d.dir(appPath, [
d.pubspec({
'name': 'app',
'dependencies': {
'foo': '^1.0.0',
},
})
]).create();
await pubGet();
await pipeline('adding_transitive', [
_PackageVersion('foo', Version.parse('2.2.3')),
_PackageVersion('transitive', Version.parse('1.0.0'))
]);
});
}
class _PackageVersion {
String name;
Version version;
_PackageVersion(this.name, this.version);
Map<String, Object> toJson() => {
'name': name,
'version': version?.toString(),
};
}