import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:flutter_plugin_tools/src/build_examples_command.dart'; import 'package:path/path.dart' as p; import 'package:platform/platform.dart'; import 'package:test/test.dart'; import 'util.dart'; void main() { group('test build_example_command', () { CommandRunner runner; RecordingProcessRunner processRunner; final String flutterCommand = LocalPlatform().isWindows ? 'flutter.bat' : 'flutter'; setUp(() { initializeFakePackages(); processRunner = RecordingProcessRunner(); final BuildExamplesCommand command = BuildExamplesCommand( mockPackagesDir, mockFileSystem, processRunner: processRunner); runner = CommandRunner( 'build_examples_command', 'Test for build_example_command'); runner.addCommand(command); cleanupPackages(); }); test('building for iOS when plugin is not set up for iOS results in no-op', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isLinuxPlugin: false); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--ipa', '--no-macos']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING IPA for $packageName', 'iOS is not supported by this plugin', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); // Output should be empty since running build-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, orderedEquals([])); cleanupPackages(); }); test('building for ios', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isIosPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'build-examples', '--ipa', '--no-macos', '--enable-experiment=exp1' ]); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING IPA for $packageName', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'build', 'ios', '--no-codesign', '--enable-experiment=exp1' ], pluginExampleDirectory.path), ])); cleanupPackages(); }); test( 'building for Linux when plugin is not set up for Linux results in no-op', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isLinuxPlugin: false); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--linux']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING Linux for $packageName', 'Linux is not supported by this plugin', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); // Output should be empty since running build-examples --linux with no // Linux implementation is a no-op. expect(processRunner.recordedCalls, orderedEquals([])); cleanupPackages(); }); test('building for Linux', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isLinuxPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--linux']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING Linux for $packageName', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall(flutterCommand, ['build', 'linux'], pluginExampleDirectory.path), ])); cleanupPackages(); }); test('building for macos with no implementation results in no-op', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ]); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--macos']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING macOS for $packageName', 'macOS is not supported by this plugin', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); // Output should be empty since running build-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, orderedEquals([])); cleanupPackages(); }); test('building for macos', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ['example', 'macos', 'macos.swift'], ], isMacOsPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--macos']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING macOS for $packageName', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall(flutterCommand, ['build', 'macos'], pluginExampleDirectory.path), ])); cleanupPackages(); }); test('building for web with no implementation results in no-op', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ]); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--web']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING web for $packageName', 'Web is not supported by this plugin', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); // Output should be empty since running build-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, orderedEquals([])); cleanupPackages(); }); test('building for web', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ['example', 'web', 'index.html'], ], isWebPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--web']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING web for $packageName', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall(flutterCommand, ['build', 'web'], pluginExampleDirectory.path), ])); cleanupPackages(); }); test( 'building for Windows when plugin is not set up for Windows results in no-op', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isWindowsPlugin: false); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--windows']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING Windows for $packageName', 'Windows is not supported by this plugin', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); // Output should be empty since running build-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, orderedEquals([])); cleanupPackages(); }); test('building for windows', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isWindowsPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--no-ipa', '--windows']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING Windows for $packageName', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall(flutterCommand, ['build', 'windows'], pluginExampleDirectory.path), ])); cleanupPackages(); }); test( 'building for Android when plugin is not set up for Android results in no-op', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isLinuxPlugin: false); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint( runner, ['build-examples', '--apk', '--no-ipa']); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING APK for $packageName', 'Android is not supported by this plugin', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); // Output should be empty since running build-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, orderedEquals([])); cleanupPackages(); }); test('building for android', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isAndroidPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'build-examples', '--apk', '--no-ipa', '--no-macos', ]); final String packageName = p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path); expect( output, orderedEquals([ '\nBUILDING APK for $packageName', '\n\n', 'All builds successful!', ]), ); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall(flutterCommand, ['build', 'apk'], pluginExampleDirectory.path), ])); cleanupPackages(); }); test('enable-experiment flag for Android', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isAndroidPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); await runCapturingPrint(runner, [ 'build-examples', '--apk', '--no-ipa', '--no-macos', '--enable-experiment=exp1' ]); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, ['build', 'apk', '--enable-experiment=exp1'], pluginExampleDirectory.path), ])); cleanupPackages(); }); test('enable-experiment flag for ios', () async { createFakePlugin('plugin', withExtraFiles: >[ ['example', 'test'], ], isIosPlugin: true); final Directory pluginExampleDirectory = mockPackagesDir.childDirectory('plugin').childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); await runCapturingPrint(runner, [ 'build-examples', '--ipa', '--no-macos', '--enable-experiment=exp1' ]); print(processRunner.recordedCalls); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'build', 'ios', '--no-codesign', '--enable-experiment=exp1' ], pluginExampleDirectory.path), ])); cleanupPackages(); }); }); }