// Copyright (c) 2023, 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:convert' show jsonDecode; import 'dart:isolate' show Isolate; import 'package:test/test.dart'; import 'test_descriptor.dart' as d; typedef Ext = ({ String package, String rootUri, String packageUri, dynamic config }); void main() { test('findExtensions', () async { final pkgLibDir = await Isolate.resolvePackageUri( Uri.parse('package:extension_discovery/'), ); final pkgDir = pkgLibDir!.resolve('..'); await d.dir('myapp', [ d.pubspec({ 'name': 'myapp', 'dependencies': { 'extension_discovery': {'path': pkgDir.toFilePath()}, }, 'environment': {'sdk': '^3.0.0'}, }), d.dir('bin', [ d.file('find_extensions.dart', ''' import 'dart:convert' show JsonEncoder; import 'package:extension_discovery/extension_discovery.dart'; Future main(List args) async { final extensions = await findExtensions(args.first); print(JsonEncoder.withIndent(' ').convert([ for (final e in extensions) { 'package': e.package, 'rootUri': e.rootUri.toString(), 'packageUri': e.packageUri.toString(), 'config': e.config, }, ])); } '''), ]) ]).create(); Future> findExtensionsInSandbox(String target) async { final out = await d.dart( d.path('myapp/bin/find_extensions.dart'), target, ); return (jsonDecode(out) as List) .cast() .map((e) => ( package: e['package'] as String, rootUri: e['rootUri'] as String, packageUri: e['packageUri'] as String, config: e['config'], )) .toList(); } // Get dependencies await d.dartPubGet(d.path('myapp')); // Check that we don't find any extensions expect(await findExtensionsInSandbox('myapp'), isEmpty); // Check that there is a myapp.json cache file await d .file( 'myapp/.dart_tool/extension_discovery/myapp.json', isNotEmpty, ) .validate(); // Check that there is README.md await d .file( 'myapp/.dart_tool/extension_discovery/README.md', isNotEmpty, ) .validate(); // Create a foo package await d.dir('foo', [ d.pubspec({ 'name': 'foo', 'environment': {'sdk': '^3.0.0'}, }), // It has a config.yaml for myapp d.dir('extension/myapp', [ d.json('config.yaml', {'fromFoo': true}), ]), ]).create(); // Update the pubspec.yaml with a dependency on foo await d.dir('myapp', [ d.pubspec({ 'name': 'myapp', 'dependencies': { 'extension_discovery': {'path': pkgDir.toFilePath()}, 'foo': {'path': '../foo'}, }, 'environment': {'sdk': '^3.0.0'}, }), ]).create(); // Get dependencies await d.dartPubGet(d.path('myapp')); // Check that we do find an extension final ext = await findExtensionsInSandbox('myapp'); expect(ext, isNotEmpty); expect( ext.any( (e) => e.package == 'foo' && e.rootUri == d.directoryUri('foo/').toString() && e.packageUri == Uri.parse('lib/').toString() && (e.config as Map)['fromFoo'] == true, ), isTrue, ); }); }