// Copyright 2014 The Flutter Authors. 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';
import 'package:args/command_runner.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/packages.dart';
import 'package:flutter_tools/src/dart/pub.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:test/fake.dart';
import 'package:unified_analytics/unified_analytics.dart';
import '../../src/context.dart';
import '../../src/fakes.dart';
import '../../src/package_config.dart';
import '../../src/test_flutter_command_runner.dart';
const String minimalV2EmbeddingManifest = r'''
''';
void main() {
late FileSystem fileSystem;
late FakePub pub;
late BufferLogger logger;
// TODO(matanlurey): Remove after `flutter_gen` is removed.
// See https://github.com/flutter/flutter/issues/102983 for details.
FeatureFlags disableExplicitPackageDependencies() {
return TestFeatureFlags(
// ignore: avoid_redundant_argument_values
isExplicitPackageDependenciesEnabled: false,
);
}
setUp(() {
Cache.disableLocking();
fileSystem = MemoryFileSystem.test();
pub = FakePub();
logger = BufferLogger.test();
});
tearDown(() {
Cache.enableLocking();
});
testUsingContext('pub shows help', () async {
final PackagesCommand command = PackagesCommand();
final CommandRunner runner = createTestCommandRunner(command);
await runner.run(['pub']);
expect(
logger.statusText,
allOf(
contains('Commands for managing Flutter packages.'),
contains('Usage: flutter pub [arguments]'),
),
);
}, overrides: {Logger: () => logger});
testUsingContext(
'pub get usage values are resilient to missing package config files before running "pub get"',
() async {
fileSystem.currentDirectory.childFile('pubspec.yaml').writeAsStringSync('name: my_app');
fileSystem.currentDirectory.childFile('.flutter-plugins').createSync();
fileSystem.currentDirectory.childFile('.flutter-plugins-dependencies').createSync();
fileSystem.currentDirectory.childDirectory('android').childFile('AndroidManifest.xml')
..createSync(recursive: true)
..writeAsStringSync(minimalV2EmbeddingManifest);
final PackagesGetCommand command = PackagesGetCommand('get', '', PubContext.pubGet);
final CommandRunner commandRunner = createTestCommandRunner(command);
await commandRunner.run(['get']);
expect(
await command.unifiedAnalyticsUsageValues('pub'),
Event.commandUsageValues(
workflow: 'pub',
commandHasTerminal: false,
packagesNumberPlugins: 0,
packagesProjectModule: false,
packagesAndroidEmbeddingVersion: 'v2',
),
);
},
overrides: {
Pub: () => pub,
ProcessManager: () => FakeProcessManager.any(),
FileSystem: () => fileSystem,
},
);
testUsingContext(
'pub get usage values are resilient to poorly formatted package config before "pub get"',
() async {
fileSystem.currentDirectory.childFile('pubspec.yaml').writeAsStringSync('name: my_app');
fileSystem.currentDirectory.childFile('.flutter-plugins').createSync();
fileSystem.currentDirectory.childFile('.flutter-plugins-dependencies').createSync();
fileSystem.currentDirectory.childFile('.dart_tool/package_config.json')
..createSync(recursive: true)
..writeAsBytesSync([0]);
fileSystem.currentDirectory.childDirectory('android').childFile('AndroidManifest.xml')
..createSync(recursive: true)
..writeAsStringSync(minimalV2EmbeddingManifest);
final PackagesGetCommand command = PackagesGetCommand('get', '', PubContext.pubGet);
final CommandRunner commandRunner = createTestCommandRunner(command);
await commandRunner.run(['get']);
expect(
await command.unifiedAnalyticsUsageValues('pub'),
Event.commandUsageValues(
workflow: 'pub',
commandHasTerminal: false,
packagesNumberPlugins: 0,
packagesProjectModule: false,
packagesAndroidEmbeddingVersion: 'v2',
),
);
},
overrides: {
Pub: () => pub,
ProcessManager: () => FakeProcessManager.any(),
FileSystem: () => fileSystem,
},
);
testUsingContext(
'pub get on target directory',
() async {
fileSystem.currentDirectory.childDirectory('target').createSync();
final Directory targetDirectory = fileSystem.currentDirectory.childDirectory('target');
targetDirectory.childFile('pubspec.yaml').writeAsStringSync('name: my_app');
final PackagesGetCommand command = PackagesGetCommand('get', '', PubContext.pubGet);
final CommandRunner commandRunner = createTestCommandRunner(command);
await commandRunner.run(['get', '--directory=${targetDirectory.path}']);
final FlutterProject rootProject = FlutterProject.fromDirectory(targetDirectory);
final File packageConfigFile = rootProject.dartTool.childFile('package_config.json');
expect(packageConfigFile.existsSync(), true);
expect(json.decode(packageConfigFile.readAsStringSync()), {
'configVersion': 2,
'packages':