blob: ec522651f8967d3dda029ecc2ac0c01561ceaf84 [file] [log] [blame]
// 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<void> main(List<String> 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<List<Ext>> findExtensionsInSandbox(String target) async {
final out = await d.dart(
d.path('myapp/bin/find_extensions.dart'),
target,
);
return (jsonDecode(out) as List<Object?>)
.cast<Map>()
.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,
);
});
}