// Copyright 2013 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 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/local.dart'; import 'package:flutter_plugin_tools/src/create_all_plugins_app_command.dart'; import 'package:test/test.dart'; import 'util.dart'; void main() { group('$CreateAllPluginsAppCommand', () { late CommandRunner runner; late CreateAllPluginsAppCommand command; late FileSystem fileSystem; late Directory testRoot; late Directory packagesDir; setUp(() { // Since the core of this command is a call to 'flutter create', the test // has to use the real filesystem. Put everything possible in a unique // temporary to minimize effect on the host system. fileSystem = const LocalFileSystem(); testRoot = fileSystem.systemTempDirectory.createTempSync(); packagesDir = testRoot.childDirectory('packages'); command = CreateAllPluginsAppCommand( packagesDir, pluginsRoot: testRoot, ); runner = CommandRunner( 'create_all_test', 'Test for $CreateAllPluginsAppCommand'); runner.addCommand(command); }); tearDown(() { testRoot.deleteSync(recursive: true); }); test('pubspec includes all plugins', () async { createFakePlugin('plugina', packagesDir); createFakePlugin('pluginb', packagesDir); createFakePlugin('pluginc', packagesDir); await runCapturingPrint(runner, ['all-plugins-app']); final List pubspec = command.appDirectory.childFile('pubspec.yaml').readAsLinesSync(); expect( pubspec, containsAll([ contains(RegExp('path: .*/packages/plugina')), contains(RegExp('path: .*/packages/pluginb')), contains(RegExp('path: .*/packages/pluginc')), ])); }); test('pubspec has overrides for all plugins', () async { createFakePlugin('plugina', packagesDir); createFakePlugin('pluginb', packagesDir); createFakePlugin('pluginc', packagesDir); await runCapturingPrint(runner, ['all-plugins-app']); final List pubspec = command.appDirectory.childFile('pubspec.yaml').readAsLinesSync(); expect( pubspec, containsAllInOrder([ contains('dependency_overrides:'), contains(RegExp('path: .*/packages/plugina')), contains(RegExp('path: .*/packages/pluginb')), contains(RegExp('path: .*/packages/pluginc')), ])); }); test('pubspec is compatible with null-safe app code', () async { createFakePlugin('plugina', packagesDir); await runCapturingPrint(runner, ['all-plugins-app']); final String pubspec = command.appDirectory.childFile('pubspec.yaml').readAsStringSync(); expect(pubspec, contains(RegExp('sdk:\\s*(?:["\']>=|[^])2\\.12\\.'))); }); test('handles --output-dir', () async { createFakePlugin('plugina', packagesDir); final Directory customOutputDir = fileSystem.systemTempDirectory.createTempSync(); await runCapturingPrint(runner, ['all-plugins-app', '--output-dir=${customOutputDir.path}']); expect(command.appDirectory.path, customOutputDir.childDirectory('all_plugins').path); }); test('logs exclusions', () async { createFakePlugin('plugina', packagesDir); createFakePlugin('pluginb', packagesDir); createFakePlugin('pluginc', packagesDir); final List output = await runCapturingPrint( runner, ['all-plugins-app', '--exclude=pluginb,pluginc']); expect( output, containsAllInOrder([ 'Exluding the following plugins from the combined build:', ' pluginb', ' pluginc', ])); }); }); }