import 'dart:io'; import 'package:path/path.dart' as p; import 'package:pipe/pipe.dart'; import 'package:test/test.dart'; void main() { late String root; setUp(() { root = Directory.systemTemp .createTempSync('pipe-package-target') .resolveSymbolicLinksSync(); File(p.join(root, 'pubspec.yaml')).writeAsStringSync('name: outer\n'); Directory(p.join(root, 'lib', 'data')).createSync(recursive: true); File(p.join(root, 'lib', 'data', 'a.dart')).writeAsStringSync(''); File(p.join(root, 'nested', 'pubspec.yaml')) ..createSync(recursive: true) ..writeAsStringSync('name: nested\n'); Directory(p.join(root, 'nested', 'lib')).createSync(); }); tearDown(() => Directory(root).deleteSync(recursive: true)); group('enclosingPackage', () { test('a package root is its own package, with no scope', () { final target = enclosingPackage(root); expect(target.root, root); expect(target.scope, isNull); }); test('a directory inside a package resolves to the package root', () { final target = enclosingPackage(p.join(root, 'lib', 'data')); expect(target.root, root); expect(target.scope, p.join('lib', 'data')); }); test('the nearest pubspec wins', () { final target = enclosingPackage(p.join(root, 'nested', 'lib')); expect(target.root, p.join(root, 'nested')); expect(target.scope, 'lib'); }); test('a missing path is returned unchanged for loadProject to reject', () { final missing = p.join(root, 'nope'); expect(enclosingPackage(missing).root, missing); expect(enclosingPackage(missing).scope, isNull); }); }); test('loadProject on a directory inside a package names the package', () { // `pipe check lib` used to say "run `dart pub get` in .../lib". expect( () => loadProject(p.join(root, 'lib')), throwsA( isA().having( (e) => e.remedy, 'remedy', allOf(contains('inside the package at $root'), contains('--dir lib')), ), ), ); }); }