// Copyright 2019 The Chromium 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:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; import 'package:flutter_tools/src/plugins.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; import '../src/common.dart'; import '../src/context.dart'; class MockFlutterProject extends Mock implements FlutterProject {} class MockIosProject extends Mock implements IosProject {} class MockMacOSProject extends Mock implements MacOSProject {} void main() { FileSystem fs; MockFlutterProject flutterProject; MockIosProject iosProject; MockMacOSProject macosProject; File packagesFile; Directory dummyPackageDirectory; setUp(() async { fs = MemoryFileSystem(); // Add basic properties to the Flutter project and subprojects flutterProject = MockFlutterProject(); when(flutterProject.directory).thenReturn(fs.directory('/')); when(flutterProject.flutterPluginsFile).thenReturn(flutterProject.directory.childFile('.plugins')); iosProject = MockIosProject(); when(flutterProject.ios).thenReturn(iosProject); when(iosProject.podManifestLock).thenReturn(flutterProject.directory.childDirectory('ios').childFile('Podfile.lock')); macosProject = MockMacOSProject(); when(flutterProject.macos).thenReturn(macosProject); when(macosProject.podManifestLock).thenReturn(flutterProject.directory.childDirectory('macos').childFile('Podfile.lock')); // Set up a simple .packages file for all the tests to use, pointing to one package. dummyPackageDirectory = fs.directory('/pubcache/apackage/lib/'); packagesFile = fs.file(fs.path.join(flutterProject.directory.path, PackageMap.globalPackagesPath)); packagesFile..createSync(recursive: true) ..writeAsStringSync('apackage:file://${dummyPackageDirectory.path}'); }); // Makes the dummy package pointed to by packagesFile look like a plugin. void configureDummyPackageAsPlugin() { dummyPackageDirectory.parent.childFile('pubspec.yaml')..createSync(recursive: true)..writeAsStringSync(''' flutter: plugin: platforms: ios: pluginClass: FLESomePlugin '''); } // Creates the files that would indicate that pod install has run for the // given project. void simulatePodInstallRun(XcodeBasedProject project) { project.podManifestLock.createSync(recursive: true); } group('refreshPlugins', () { testUsingContext('Refreshing the plugin list is a no-op when the plugins list stays empty', () { refreshPluginsList(flutterProject); expect(flutterProject.flutterPluginsFile.existsSync(), false); }, overrides: { FileSystem: () => fs, }); testUsingContext('Refreshing the plugin list deletes the plugin file when there were plugins but no longer are', () { flutterProject.flutterPluginsFile.createSync(); when(iosProject.existsSync()).thenReturn(false); when(macosProject.existsSync()).thenReturn(false); refreshPluginsList(flutterProject); expect(flutterProject.flutterPluginsFile.existsSync(), false); }, overrides: { FileSystem: () => fs, }); testUsingContext('Refreshing the plugin list creates a plugin directory when there are plugins', () { configureDummyPackageAsPlugin(); when(iosProject.existsSync()).thenReturn(false); when(macosProject.existsSync()).thenReturn(false); refreshPluginsList(flutterProject); expect(flutterProject.flutterPluginsFile.existsSync(), true); }, overrides: { FileSystem: () => fs, }); testUsingContext('Changes to the plugin list invalidates the Cocoapod lockfiles', () { simulatePodInstallRun(iosProject); simulatePodInstallRun(macosProject); configureDummyPackageAsPlugin(); when(iosProject.existsSync()).thenReturn(true); when(macosProject.existsSync()).thenReturn(true); refreshPluginsList(flutterProject); expect(iosProject.podManifestLock.existsSync(), false); expect(macosProject.podManifestLock.existsSync(), false); }, overrides: { FileSystem: () => fs, }); }); }