// 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 'package:args/command_runner.dart'; import 'package:conductor_core/src/clean.dart'; import 'package:conductor_core/src/repository.dart'; import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:platform/platform.dart'; import './common.dart'; void main() { group('clean command', () { const String flutterRoot = '/flutter'; const String checkoutsParentDirectory = '$flutterRoot/dev/tools/'; const String stateFilePath = '/state-file.json'; late MemoryFileSystem fileSystem; late FakePlatform platform; late TestStdio stdio; late FakeProcessManager processManager; late CommandRunner<void> runner; setUp(() { stdio = TestStdio(); fileSystem = MemoryFileSystem.test(); final String operatingSystem = const LocalPlatform().operatingSystem; final String pathSeparator = operatingSystem == 'windows' ? r'\' : '/'; processManager = FakeProcessManager.empty(); platform = FakePlatform( environment: <String, String>{'HOME': '/path/to/user/home'}, pathSeparator: pathSeparator, ); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: fileSystem.directory(checkoutsParentDirectory), platform: platform, processManager: processManager, stdio: stdio, ); final CleanCommand command = CleanCommand( checkouts: checkouts, ); runner = CommandRunner<void>('clean-test', '')..addCommand(command); }); test('throws if no state file found', () async { await expectLater( () async => runner.run(<String>[ 'clean', '--$kStateOption', stateFilePath, '--$kYesFlag', ]), throwsExceptionWith( 'No persistent state file found at $stateFilePath', ), ); }); test('deletes an empty state file', () async { final File stateFile = fileSystem.file(stateFilePath); stateFile.writeAsStringSync(''); await runner.run(<String>[ 'clean', '--$kStateOption', stateFile.path, '--$kYesFlag', ]); expect(stateFile.existsSync(), false); }); test('deletes a state file with content', () async { final File stateFile = fileSystem.file(stateFilePath); stateFile.writeAsStringSync('{status: pending}'); await runner.run(<String>[ 'clean', '--$kStateOption', stateFile.path, '--$kYesFlag', ]); expect(stateFile.existsSync(), false); }); }, onPlatform: <String, dynamic>{ 'windows': const Skip('Flutter Conductor only supported on macos/linux'), }); }