| // 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 'package:test/test.dart'; | |
| import '../descriptor.dart' as d; | |
| import '../golden_file.dart'; | |
| import '../package_server.dart'; | |
| import '../test_pub.dart'; | |
| extension on GoldenTestContext { | |
| /// Try running 'pub outdated' with a number of different sets of arguments. | |
| /// And compare to results from test/testdata/goldens/... | |
| Future<void> runOutdatedTests({ | |
| Map<String, String>? environment, | |
| String? workingDirectory, | |
| List<List<String>>? extraCommands, | |
| }) async { | |
| final commands = [ | |
| ['outdated', '--json'], | |
| ['outdated', '--no-color'], | |
| ['outdated', '--no-color', '--no-transitive'], | |
| ['outdated', '--no-color', '--up-to-date'], | |
| ['outdated', '--no-color', '--prereleases'], | |
| ['outdated', '--no-color', '--no-dev-dependencies'], | |
| ['outdated', '--no-color', '--no-dependency-overrides'], | |
| ['outdated', '--json', '--no-dev-dependencies'], | |
| ...?extraCommands, | |
| ]; | |
| for (final args in commands) { | |
| await run( | |
| args, | |
| environment: environment, | |
| workingDirectory: workingDirectory, | |
| ); | |
| } | |
| } | |
| } | |
| Future<void> main() async { | |
| testWithGolden('no pubspec', (ctx) async { | |
| await d.dir(appPath, []).create(); | |
| await ctx.run(['outdated']); | |
| }); | |
| testWithGolden('no lockfile', (ctx) async { | |
| await d.appDir(dependencies: {'foo': '^1.0.0', 'bar': '^1.0.0'}).create(); | |
| await servePackages() | |
| ..serve('foo', '1.2.3') | |
| ..serve('bar', '1.2.3') | |
| ..serve('bar', '2.0.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('no dependencies', (ctx) async { | |
| await d.appDir().create(); | |
| await pubGet(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('newer versions available', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'}) | |
| ..serve('bar', '1.0.0') | |
| ..serve( | |
| 'builder', | |
| '1.2.3', | |
| deps: {'transitive': '^1.0.0', 'dev_trans': '^1.0.0'}, | |
| ) | |
| ..serve('transitive', '1.2.3') | |
| ..serve('dev_trans', '1.0.0') | |
| ..serve('retracted', '1.0.0') | |
| ..serve('retracted', '1.0.1'); | |
| await d.dir('local_package', [ | |
| d.libDir('local_package'), | |
| d.libPubspec('local_package', '0.0.1'), | |
| ]).create(); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': { | |
| 'foo': '^1.0.0', | |
| 'bar': '^1.0.0', | |
| 'local_package': {'path': '../local_package'}, | |
| 'retracted': '^1.0.0', | |
| }, | |
| 'dev_dependencies': {'builder': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder | |
| ..serve('foo', '1.3.0', deps: {'transitive': '>=1.0.0<3.0.0'}) | |
| ..serve( | |
| 'foo', | |
| '2.0.0', | |
| deps: {'transitive': '>=1.0.0<3.0.0', 'transitive2': '^1.0.0'}, | |
| ) | |
| ..serve('foo', '3.0.0', deps: {'transitive': '^2.0.0'}) | |
| ..serve('builder', '1.3.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve( | |
| 'builder', | |
| '2.0.0', | |
| deps: { | |
| 'transitive': '^1.0.0', | |
| 'transitive3': '^1.0.0', | |
| 'dev_trans': '^1.0.0', | |
| }, | |
| ) | |
| ..serve('builder', '3.0.0-alpha', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.3.0') | |
| ..serve('transitive', '2.0.0') | |
| ..serve('transitive2', '1.0.0') | |
| ..serve('transitive3', '1.0.0') | |
| ..serve('dev_trans', '2.0.0') | |
| // Even though the current (and latest) version is retracted, it should be | |
| // the one shown in the upgradable and resolvable columns. | |
| ..retractPackageVersion('retracted', '1.0.1'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show discontinued', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'}) | |
| ..serve('bar', '1.0.0') | |
| ..serve('baz', '1.0.0') | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0', 'bar': '^1.0.0', 'baz': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.discontinue('foo'); | |
| builder.discontinue('baz', replacementText: 'newbaz'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show discontinued with no latest version', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'}) | |
| ..serve('bar', '1.0.0') | |
| ..serve('baz', '1.0.0') | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0', 'bar': '^1.0.0', 'baz': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.retractPackageVersion('foo', '1.2.3'); | |
| builder.discontinue('foo'); | |
| builder.discontinue('baz', replacementText: 'newbaz'); | |
| await ctx.runOutdatedTests( | |
| extraCommands: [ | |
| ['outdated', '--json', '--up-to-date'], | |
| ], | |
| ); | |
| }); | |
| testWithGolden('show retracted', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.retractPackageVersion('foo', '1.0.0'); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden("don't show retracted", (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.retractPackageVersion('foo', '1.0.0'); | |
| builder.serve('foo', '1.2.0'); | |
| await pubUpgrade(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show discontinued and retracted', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('bar', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0', 'bar': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.discontinue('foo'); | |
| builder.retractPackageVersion('foo', '1.0.0'); | |
| builder.discontinue('bar'); | |
| builder.retractPackageVersion('bar', '1.0.0'); | |
| builder.serve('foo', '1.2.0', deps: {'transitive': '^1.0.0'}); | |
| await pubGet(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('circular dependency on root', (ctx) async { | |
| final server = await servePackages(); | |
| server.serve('foo', '1.2.3', deps: {'app': '^1.0.0'}); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| server.serve('foo', '1.3.0', deps: {'app': '^1.0.1'}); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('mutually incompatible newer versions', (ctx) async { | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'dependencies': {'foo': '^1.0.0', 'bar': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await servePackages() | |
| ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'}) | |
| ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'}) | |
| ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'}) | |
| ..serve('bar', '2.0.0', deps: {'foo': '^1.0.0'}); | |
| await pubGet(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('overridden dependencies', (ctx) async { | |
| ensureGit(); | |
| await servePackages() | |
| ..serve('foo', '1.0.0') | |
| ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'}) | |
| ..serve('bar', '1.0.0') | |
| ..serve('bar', '2.0.0') | |
| ..serve('baz', '1.0.0') | |
| ..serve('baz', '2.0.0'); | |
| await d.git('foo.git', [d.libPubspec('foo', '1.0.1')]).create(); | |
| await d.dir('bar', [d.libPubspec('bar', '1.0.1')]).create(); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'dependencies': {'foo': '^1.0.0', 'bar': '^2.0.0', 'baz': '^1.0.0'}, | |
| 'dependency_overrides': { | |
| 'foo': { | |
| 'git': {'url': '../foo.git'}, | |
| }, | |
| 'bar': {'path': '../bar'}, | |
| 'baz': '2.0.0', | |
| }, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('overridden dependencies - no resolution', (ctx) async { | |
| ensureGit(); | |
| await servePackages() | |
| ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'}) | |
| ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'}) | |
| ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'}) | |
| ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'}); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'dependencies': {'foo': 'any', 'bar': 'any'}, | |
| 'dependency_overrides': {'foo': '1.0.0', 'bar': '1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('overridden dependencies with retraction- no resolution ', ( | |
| ctx, | |
| ) async { | |
| ensureGit(); | |
| final builder = | |
| await servePackages() | |
| ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'}) | |
| ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'}) | |
| ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'}) | |
| ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'}); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'dependencies': {'foo': 'any', 'bar': 'any'}, | |
| 'dependency_overrides': {'foo': '1.0.0', 'bar': '1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.retractPackageVersion('bar', '1.0.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('do not report ignored advisories', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| 'ignored_advisories': ['ABCD-1234-5678-9101', '1234-ABCD-EFGH-IJKL'], | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.addAdvisory( | |
| advisoryId: 'EFGH-0000-1111-2222', | |
| displayUrl: 'https://github.com/advisories/EFGH-0000-1111-2222', | |
| aliases: ['1234-ABCD-EFGH-IJKL'], | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('only report unignored advisory', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| 'ignored_advisories': ['ABCD-1234-5678-9101', '1234-ABCD-EFGH-IJKL'], | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.addAdvisory( | |
| advisoryId: 'EFGH-0000-1111-2222', | |
| aliases: ['1234-ABCD-EFGH-IJKL'], | |
| displayUrl: 'https://github.com/advisories/EFGH-0000-1111-2222', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.addAdvisory( | |
| advisoryId: 'VXYZ-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/VXYZ-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('do not show advisories if no version is affected', ( | |
| ctx, | |
| ) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['0.1.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - current', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - current, same package mentioned twice', ( | |
| ctx, | |
| ) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['0.0.1']), | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - current also retracted', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.retractPackageVersion('foo', '1.0.0'); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - latest', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.2.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - latest also discontinued', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.discontinue('foo'); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.2.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - all versions', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0', '1.2.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('show advisory - several advisories', (ctx) async { | |
| final builder = await servePackages(); | |
| builder | |
| ..serve('foo', '1.0.0', deps: {'transitive': '^1.0.0'}) | |
| ..serve('transitive', '1.2.3'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'dependencies': {'foo': '^1.0.0'}, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| builder.addAdvisory( | |
| advisoryId: 'ABCD-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/ABCD-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0', '1.2.0']), | |
| ], | |
| ); | |
| builder.addAdvisory( | |
| advisoryId: 'VXYZ-1234-5678-9101', | |
| displayUrl: 'https://github.com/advisories/VXYZ-1234-5678-9101', | |
| affectedPackages: [ | |
| AffectedPackage(name: 'foo', versions: ['1.0.0']), | |
| ], | |
| ); | |
| builder.serve('foo', '1.2.0'); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('latest version reported while locked on a prerelease ' | |
| 'can be a prerelease', (ctx) async { | |
| await servePackages() | |
| ..serve('foo', '0.9.0') | |
| ..serve('foo', '1.0.0-dev.1') | |
| ..serve('foo', '1.0.0-dev.2') | |
| ..serve('bar', '0.9.0') | |
| ..serve('bar', '1.0.0-dev.1') | |
| ..serve('bar', '1.0.0-dev.2') | |
| ..serve('mop', '0.10.0-dev') | |
| ..serve('mop', '0.10.0') | |
| ..serve('mop', '1.0.0-dev'); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'dependencies': { | |
| 'foo': '1.0.0-dev.1', | |
| 'bar': '^0.9.0', | |
| 'mop': '0.10.0-dev', | |
| }, | |
| }), | |
| ]).create(); | |
| await pubGet(); | |
| await ctx.runOutdatedTests(); | |
| }); | |
| testWithGolden('reports dependencies from all of workspace', (ctx) async { | |
| final server = await servePackages(); | |
| server.serve('myapp', '1.2.4'); | |
| server.serve('dep', '0.9.0', deps: {'myapp': '^1.2.3'}); | |
| server.serve('dep', '0.8.0', deps: {'myapp': '^1.2.3'}); | |
| server.serve('dep', '1.0.0'); | |
| server.serve('dep_a', '0.9.0'); | |
| server.serve('dep_a', '1.0.0'); | |
| server.serve('dev_dep_a', '0.9.0'); | |
| server.serve('dev_dep_a', '1.0.0'); | |
| await d.dir(appPath, [ | |
| d.libPubspec( | |
| 'myapp', | |
| '1.2.3', | |
| deps: {'dep': '^0.9.0'}, | |
| extras: { | |
| 'workspace': ['pkgs/a'], | |
| }, | |
| sdk: '^3.5.0', | |
| ), | |
| d.dir('pkgs', [ | |
| d.dir('a', [ | |
| d.libPubspec( | |
| 'a', | |
| '1.1.1', | |
| deps: {'myapp': '^1.0.0', 'dep_a': '^0.9.0'}, | |
| devDeps: {'dev_dep_a': '^0.9.0'}, | |
| extras: { | |
| 'dependency_overrides': {'dep': '0.8.0'}, | |
| }, | |
| resolutionWorkspace: true, | |
| ), | |
| ]), | |
| ]), | |
| ]).create(); | |
| await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}); | |
| server.serve('dep', '0.9.5'); | |
| server.serve('dep_a', '0.9.5'); | |
| server.serve('dev_dep_a', '0.9.5'); | |
| await ctx.runOutdatedTests(environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}); | |
| }); | |
| testWithGolden('Handles SDK dependencies', (ctx) async { | |
| await servePackages() | |
| ..serve( | |
| 'foo', | |
| '1.0.0', | |
| pubspec: { | |
| 'environment': {'sdk': '>=2.10.0 <3.0.0'}, | |
| }, | |
| ) | |
| ..serve( | |
| 'foo', | |
| '1.1.0', | |
| pubspec: { | |
| 'environment': {'sdk': '>=2.10.0 <3.0.0'}, | |
| }, | |
| ) | |
| ..serve( | |
| 'foo', | |
| '2.0.0', | |
| pubspec: { | |
| 'environment': {'sdk': '>=2.12.0 <3.0.0'}, | |
| }, | |
| ); | |
| await d.dir('flutter-root', [ | |
| d.dir('packages', [ | |
| d.dir('flutter', [ | |
| d.libPubspec('flutter', '1.0.0', sdk: '>=2.12.0 <3.0.0'), | |
| ]), | |
| d.dir('flutter_test', [ | |
| d.libPubspec('flutter_test', '1.0.0', sdk: '>=2.10.0 <3.0.0'), | |
| ]), | |
| ]), | |
| d.flutterVersion('1.2.3'), | |
| ]).create(); | |
| await d.dir(appPath, [ | |
| d.pubspec({ | |
| 'name': 'app', | |
| 'version': '1.0.1', | |
| 'environment': {'sdk': '>=2.12.0 <3.0.0'}, | |
| 'dependencies': { | |
| 'foo': '^1.0.0', | |
| 'flutter': {'sdk': 'flutter'}, | |
| }, | |
| 'dev_dependencies': { | |
| 'foo': '^1.0.0', | |
| 'flutter_test': {'sdk': 'flutter'}, | |
| }, | |
| }), | |
| ]).create(); | |
| await pubGet( | |
| environment: { | |
| 'FLUTTER_ROOT': d.path('flutter-root'), | |
| '_PUB_TEST_SDK_VERSION': '2.13.0', | |
| }, | |
| ); | |
| await ctx.runOutdatedTests( | |
| environment: { | |
| 'FLUTTER_ROOT': d.path('flutter-root'), | |
| '_PUB_TEST_SDK_VERSION': '2.13.0', | |
| // To test that the reproduction command is reflected correctly. | |
| 'PUB_ENVIRONMENT': 'flutter_cli:get', | |
| }, | |
| ); | |
| }); | |
| testWithGolden('does not allow arguments - handles bad flags', (ctx) async { | |
| await ctx.run(['outdated', 'random_argument']); | |
| await ctx.run(['outdated', '--bad_flag']); | |
| }); | |
| testWithGolden('Handles packages that are not found on server', (ctx) async { | |
| await servePackages(); | |
| await d | |
| .appDir( | |
| dependencies: {'foo': 'any'}, | |
| pubspec: { | |
| 'dependency_overrides': { | |
| 'foo': {'path': '../foo'}, | |
| }, | |
| }, | |
| ) | |
| .create(); | |
| await d.dir('foo', [d.libPubspec('foo', '1.0.0')]).create(); | |
| await ctx.run(['outdated']); | |
| }); | |
| testWithGolden('outputs package names as links', colors: true, (ctx) async { | |
| final server = await servePackages(); | |
| server.serve('foo', '1.2.3'); | |
| await d.appDir(dependencies: {'foo': '^1.0.0'}).create(); | |
| await pubGet(); | |
| server.serve('foo', '1.3.0'); | |
| // Treat the local test server as the official pub.dev server so names | |
| // render as hyperlinks. | |
| await ctx.run( | |
| ['outdated', '--color'], | |
| environment: {'_PUB_TEST_DEFAULT_HOSTED_URL': server.url}, | |
| ); | |
| await ctx.run( | |
| ['outdated', '--no-color'], | |
| environment: {'_PUB_TEST_DEFAULT_HOSTED_URL': server.url}, | |
| ); | |
| // Don't treat the local test server as pub.dev so names | |
| // do not render as hyperlinks. | |
| await ctx.run(['outdated', '--color']); | |
| }); | |
| } |