182 lines
5.7 KiB
Dart
182 lines
5.7 KiB
Dart
import 'dart:io';
|
|
import 'package:test/test.dart';
|
|
import 'package:platform_support/src/composer.dart';
|
|
import 'package:path/path.dart' as path;
|
|
|
|
void main() {
|
|
group('Composer', () {
|
|
late Directory tempDir;
|
|
late String pubspecPath;
|
|
late Composer composer;
|
|
|
|
setUp(() async {
|
|
tempDir = await Directory.systemTemp.createTemp('composer_test_');
|
|
pubspecPath = path.join(tempDir.path, 'pubspec.yaml');
|
|
|
|
// Create a test pubspec.yaml
|
|
await File(pubspecPath).writeAsString('''
|
|
name: test_package
|
|
description: A test package
|
|
version: 1.0.0
|
|
|
|
environment:
|
|
sdk: ">=3.0.0 <4.0.0"
|
|
|
|
dependencies:
|
|
test_dep: ^1.0.0
|
|
|
|
dev_dependencies:
|
|
test_dev_dep: ^1.0.0
|
|
''');
|
|
|
|
composer = Composer(pubspecPath);
|
|
});
|
|
|
|
tearDown(() async {
|
|
await tempDir.delete(recursive: true);
|
|
});
|
|
|
|
test('reads package information correctly', () {
|
|
expect(composer.name, equals('test_package'));
|
|
expect(composer.version, equals('1.0.0'));
|
|
expect(composer.description, equals('A test package'));
|
|
});
|
|
|
|
test('reads dependencies correctly', () {
|
|
expect(composer.dependencies, containsPair('test_dep', '^1.0.0'));
|
|
expect(composer.devDependencies, containsPair('test_dev_dep', '^1.0.0'));
|
|
});
|
|
|
|
test('adds a dependency', () async {
|
|
await composer.require('new_dep', version: '^2.0.0');
|
|
|
|
// Reload composer to verify changes were saved
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.dependencies, containsPair('new_dep', '^2.0.0'));
|
|
});
|
|
|
|
test('adds a dev dependency', () async {
|
|
await composer.require('new_dev_dep', version: '^2.0.0', dev: true);
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.devDependencies, containsPair('new_dev_dep', '^2.0.0'));
|
|
});
|
|
|
|
test('removes a dependency', () async {
|
|
await composer.remove('test_dep');
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.dependencies, isNot(contains('test_dep')));
|
|
});
|
|
|
|
test('removes a dev dependency', () async {
|
|
await composer.remove('test_dev_dep', dev: true);
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.devDependencies, isNot(contains('test_dev_dep')));
|
|
});
|
|
|
|
test('checks if package is installed', () {
|
|
expect(composer.hasPackage('test_dep'), isTrue);
|
|
expect(composer.hasPackage('test_dev_dep', dev: true), isTrue);
|
|
expect(composer.hasPackage('nonexistent'), isFalse);
|
|
});
|
|
|
|
test('handles missing pubspec.yaml', () {
|
|
expect(
|
|
() => Composer('nonexistent.yaml'),
|
|
throwsA(isA<FileSystemException>()),
|
|
);
|
|
});
|
|
|
|
test('preserves file formatting', () async {
|
|
final originalContent = await File(pubspecPath).readAsString();
|
|
await composer.require('new_dep', version: '^2.0.0');
|
|
final newContent = await File(pubspecPath).readAsString();
|
|
|
|
// Verify that the basic structure is preserved
|
|
expect(newContent, contains('name: test_package'));
|
|
expect(newContent, contains('description: A test package'));
|
|
expect(newContent, contains('version: 1.0.0'));
|
|
expect(newContent, contains('dependencies:'));
|
|
expect(newContent, contains('dev_dependencies:'));
|
|
});
|
|
|
|
test('handles empty dependencies sections', () async {
|
|
// Create pubspec without dependencies
|
|
await File(pubspecPath).writeAsString('''
|
|
name: test_package
|
|
version: 1.0.0
|
|
environment:
|
|
sdk: ">=3.0.0 <4.0.0"
|
|
''');
|
|
|
|
composer = Composer(pubspecPath);
|
|
await composer.require('new_dep', version: '^1.0.0');
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.dependencies, containsPair('new_dep', '^1.0.0'));
|
|
});
|
|
|
|
test('maintains dependency order', () async {
|
|
await composer.require('a_dep', version: '^1.0.0');
|
|
await composer.require('b_dep', version: '^1.0.0');
|
|
await composer.require('c_dep', version: '^1.0.0');
|
|
|
|
final content = await File(pubspecPath).readAsString();
|
|
final aIndex = content.indexOf('a_dep:');
|
|
final bIndex = content.indexOf('b_dep:');
|
|
final cIndex = content.indexOf('c_dep:');
|
|
|
|
expect(aIndex, lessThan(bIndex));
|
|
expect(bIndex, lessThan(cIndex));
|
|
});
|
|
|
|
test('validates version constraints', () async {
|
|
// Valid version constraints
|
|
await composer.require('valid_dep1', version: '^1.0.0');
|
|
await composer.require('valid_dep2', version: '>=2.0.0 <3.0.0');
|
|
await composer.require('valid_dep3', version: 'any');
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.dependencies['valid_dep1'], equals('^1.0.0'));
|
|
expect(composer.dependencies['valid_dep2'], equals('>=2.0.0 <3.0.0'));
|
|
expect(composer.dependencies['valid_dep3'], equals('any'));
|
|
});
|
|
|
|
test('handles path dependencies', () async {
|
|
await composer.require('path_dep', version: 'path: ../path_dep');
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.dependencies['path_dep'], equals('path: ../path_dep'));
|
|
});
|
|
|
|
test('handles git dependencies', () async {
|
|
const gitUrl = 'git: https://github.com/user/repo.git';
|
|
await composer.require('git_dep', version: gitUrl);
|
|
|
|
composer = Composer(pubspecPath);
|
|
expect(composer.dependencies['git_dep'], equals(gitUrl));
|
|
});
|
|
|
|
test('preserves dependency overrides', () async {
|
|
// Create pubspec with dependency overrides
|
|
await File(pubspecPath).writeAsString('''
|
|
name: test_package
|
|
version: 1.0.0
|
|
environment:
|
|
sdk: ">=3.0.0 <4.0.0"
|
|
|
|
dependency_overrides:
|
|
test_override: ^2.0.0
|
|
''');
|
|
|
|
composer = Composer(pubspecPath);
|
|
await composer.require('new_dep', version: '^1.0.0');
|
|
|
|
final content = await File(pubspecPath).readAsString();
|
|
expect(content, contains('dependency_overrides:'));
|
|
expect(content, contains('test_override: ^2.0.0'));
|
|
});
|
|
});
|
|
}
|