diff --git a/widget_driver/example/macos/Podfile b/widget_driver/example/macos/Podfile index dade8df..1afff9d 100644 --- a/widget_driver/example/macos/Podfile +++ b/widget_driver/example/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.11' +platform :macos, '12' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -36,5 +36,9 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + # Force a consistent deployment target; some pod subprojects ship stale defaults (e.g. 10.14/10.15) + config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '12.0' + end end end diff --git a/widget_driver/example/macos/Podfile.lock b/widget_driver/example/macos/Podfile.lock index 9c1695c..99503d8 100644 --- a/widget_driver/example/macos/Podfile.lock +++ b/widget_driver/example/macos/Podfile.lock @@ -1,37 +1,30 @@ PODS: - FlutterMacOS (1.0.0) - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - - path_provider_macos (0.0.1): + - path_provider_foundation (0.0.1): + - Flutter - FlutterMacOS - - sqflite (0.0.2): + - sqflite_darwin (0.0.4): + - Flutter - FlutterMacOS - - FMDB (>= 2.7.5) DEPENDENCIES: - FlutterMacOS (from `Flutter/ephemeral`) - - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - -SPEC REPOS: - trunk: - - FMDB + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) EXTERNAL SOURCES: FlutterMacOS: :path: Flutter/ephemeral - path_provider_macos: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin SPEC CHECKSUMS: - FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19 - sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 -PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c +PODFILE CHECKSUM: 33bf4e124084a7b149886b8b5bc450dc18071137 -COCOAPODS: 1.11.3 +COCOAPODS: 1.16.2 diff --git a/widget_driver/example/macos/Runner.xcodeproj/project.pbxproj b/widget_driver/example/macos/Runner.xcodeproj/project.pbxproj index 273ae29..16794c4 100644 --- a/widget_driver/example/macos/Runner.xcodeproj/project.pbxproj +++ b/widget_driver/example/macos/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -203,7 +203,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -256,6 +256,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -404,7 +405,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -483,7 +484,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -530,7 +531,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/widget_driver/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/widget_driver/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index fb7259e..12076c8 100644 --- a/widget_driver/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/widget_driver/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ diff --git a/widget_driver/example/macos/Runner/AppDelegate.swift b/widget_driver/example/macos/Runner/AppDelegate.swift index d53ef64..b3c1761 100644 --- a/widget_driver/example/macos/Runner/AppDelegate.swift +++ b/widget_driver/example/macos/Runner/AppDelegate.swift @@ -1,9 +1,13 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/widget_driver/example/pubspec.yaml b/widget_driver/example/pubspec.yaml index 8c00183..ddca71b 100644 --- a/widget_driver/example/pubspec.yaml +++ b/widget_driver/example/pubspec.yaml @@ -15,8 +15,8 @@ dependencies: meta: ^1.7.0 get_it: ^7.2.0 provider: ^6.0.4 - cached_network_image: ^3.0.0 - http: ^0.13.5 + cached_network_image: ^3.4.1 + http: ^1.6.0 dev_dependencies: flutter_test: diff --git a/widget_driver/example/web/index.html b/widget_driver/example/web/index.html index 41b3bc3..1aa025d 100644 --- a/widget_driver/example/web/index.html +++ b/widget_driver/example/web/index.html @@ -31,28 +31,8 @@ example - - - - - + diff --git a/widget_driver/lib/src/utils/platform_environment.dart b/widget_driver/lib/src/utils/platform_environment.dart deleted file mode 100644 index 9405770..0000000 --- a/widget_driver/lib/src/utils/platform_environment.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/foundation.dart'; - -/// The [Platform] contains helper functions to check which -/// platform we are running on. E.g. `isIOS`, `isAndroid` etc. -/// But for some reason it does not contain the info if we are running on web. -/// So this extension adds a helper function which returns this info. -extension WebPlatformInfo on Platform { - static bool get isWeb => kIsWeb; -} - -/// A callback which provides the current runtime environment as a 'Map' -/// where the key is the name of an environment variable and the value is its current value. -typedef EnvironmentCallback = Map Function(); - -/// A wrapper class around [Platform.environment] for getting -/// information about the environment for the current platform process. -/// -/// In the default [Platform] when you are running for 'Web' -/// and you try to access the [Platform.environment] then an -/// exception is thrown since `Web` does not support `environment`. -/// This wrapper class takes care of this and just ignores environment requests -/// made when running as `Web`. -class PlatformEnvironment { - final bool _isWeb; - final EnvironmentCallback _getEnvironment; - - PlatformEnvironment({ - bool? isWeb, - EnvironmentCallback? getEnvironment, - }) : _isWeb = isWeb ?? WebPlatformInfo.isWeb, - _getEnvironment = getEnvironment ?? (() => Platform.environment); - - bool containsKey(Object? key) { - if (_platformSupportsEnvironmentVariables()) { - return _getEnvironment().containsKey(key); - } else { - return false; - } - } - - bool _platformSupportsEnvironmentVariables() { - return !_isWeb; - } -} diff --git a/widget_driver/lib/src/utils/runtime_environment_info.dart b/widget_driver/lib/src/utils/runtime_environment_info.dart index fe45a03..9ac0866 100644 --- a/widget_driver/lib/src/utils/runtime_environment_info.dart +++ b/widget_driver/lib/src/utils/runtime_environment_info.dart @@ -1,21 +1,30 @@ -import 'platform_environment.dart'; +import 'package:flutter/widgets.dart'; + +/// A callback which returns `true` if the current runtime is a `flutter test` run. +typedef IsRunningInTestCallback = bool Function(); /// A helper class which gives you info about /// the environment for the current runtime. class RuntimeEnvironmentInfo { - static const String _flutterTestEnvKey = 'FLUTTER_TEST'; + // `flutter test` always installs `AutomatedTestWidgetsFlutterBinding`, on every + // platform (including web, where there is no process environment to check instead). + static const String _testBindingTypeName = 'AutomatedTestWidgetsFlutterBinding'; - final PlatformEnvironment _platformEnvironment; + final IsRunningInTestCallback _isRunningInTest; RuntimeEnvironmentInfo({ - PlatformEnvironment? platformEnvironment, - }) : _platformEnvironment = platformEnvironment ?? PlatformEnvironment(); + IsRunningInTestCallback? isRunningInTest, + }) : _isRunningInTest = isRunningInTest ?? _isRunningInTestBinding; + + static bool _isRunningInTestBinding() { + return WidgetsBinding.instance.runtimeType.toString() == _testBindingTypeName; + } /// Returns `true` if the current runtime is in a test environment and tests are running. bool isRunningInTestEnvironment() { bool isRunningInTest = false; assert(() { - isRunningInTest = _platformEnvironment.containsKey(_flutterTestEnvKey); + isRunningInTest = _isRunningInTest(); return true; }()); return isRunningInTest; diff --git a/widget_driver/pubspec.yaml b/widget_driver/pubspec.yaml index 00df56b..e8ac408 100644 --- a/widget_driver/pubspec.yaml +++ b/widget_driver/pubspec.yaml @@ -20,3 +20,4 @@ dev_dependencies: flutter_lints: ^1.0.4 mocktail: ^1.0.4 provider: ^6.0.4 + widget_driver_test: diff --git a/widget_driver/test/utils/platform_environment_test.dart b/widget_driver/test/utils/platform_environment_test.dart deleted file mode 100644 index cb8f988..0000000 --- a/widget_driver/test/utils/platform_environment_test.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:widget_driver/src/utils/platform_environment.dart'; - -void main() { - group('PlatformEnvironment:', () { - late Map _mockEnvironment; - late EnvironmentCallback _mockGetEnvironment; - - setUp(() { - _mockEnvironment = {}; - _mockGetEnvironment = (() => _mockEnvironment); - }); - - group('When not web:', () { - test('Calling containsKey(...) returns true for defined environment keys', () { - _mockEnvironment = {'SomeKey': 'SomeValue'}; - final platformEnvironment = PlatformEnvironment( - isWeb: false, - getEnvironment: _mockGetEnvironment, - ); - expect(platformEnvironment.containsKey('SomeKey'), true); - }); - - test('Calling containsKey(...) returns false for not defined environment keys', () { - _mockEnvironment = {'SomeOtherKey': 'SomeOtherValue'}; - final platformEnvironment = PlatformEnvironment( - isWeb: false, - getEnvironment: _mockGetEnvironment, - ); - expect(platformEnvironment.containsKey('SomeKey'), false); - }); - }); - - group('When web:', () { - test('Calling containsKey(...) returns false even for defined environment keys', () { - _mockEnvironment = {'SomeKey': 'SomeValue'}; - final platformEnvironment = PlatformEnvironment( - isWeb: true, - getEnvironment: _mockGetEnvironment, - ); - // Since the `web` does not support using `Environment` - // then we always get false here when running as `web`. - expect(platformEnvironment.containsKey('SomeKey'), false); - }); - - test('Calling containsKey(...) returns false for not defined environment keys', () { - _mockEnvironment = {'SomeOtherKey': 'SomeOtherValue'}; - final platformEnvironment = PlatformEnvironment( - isWeb: true, - getEnvironment: _mockGetEnvironment, - ); - expect(platformEnvironment.containsKey('SomeKey'), false); - }); - }); - }); -} diff --git a/widget_driver/test/utils/runtime_environment_info_test.dart b/widget_driver/test/utils/runtime_environment_info_test.dart index db7c11d..671e106 100644 --- a/widget_driver/test/utils/runtime_environment_info_test.dart +++ b/widget_driver/test/utils/runtime_environment_info_test.dart @@ -1,38 +1,29 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:widget_driver/src/utils/platform_environment.dart'; import 'package:widget_driver/src/utils/runtime_environment_info.dart'; -class MockPlatformEnvironment extends Mock implements PlatformEnvironment {} - void main() { group('RuntimeEnvironmentInfo:', () { - late MockPlatformEnvironment _mockPlatformEnvironment; - - setUp(() { - _mockPlatformEnvironment = MockPlatformEnvironment(); - }); - group('Is running tests:', () { - test('Returns true when environment says `test` key exists', () { - when(() => _mockPlatformEnvironment.containsKey(any())).thenReturn(true); - final runtimeEnvironmentInfo = RuntimeEnvironmentInfo(platformEnvironment: _mockPlatformEnvironment); + test('Returns true when the test binding is detected', () { + final runtimeEnvironmentInfo = RuntimeEnvironmentInfo(isRunningInTest: () => true); expect(runtimeEnvironmentInfo.isRunningInTestEnvironment(), true); }); - test('Returns false when environment says that no `test` key exists', () { - when(() => _mockPlatformEnvironment.containsKey(any())).thenReturn(false); - final runtimeEnvironmentInfo = RuntimeEnvironmentInfo(platformEnvironment: _mockPlatformEnvironment); + test('Returns false when the test binding is not detected', () { + final runtimeEnvironmentInfo = RuntimeEnvironmentInfo(isRunningInTest: () => false); expect(runtimeEnvironmentInfo.isRunningInTestEnvironment(), false); }); }); group('Constructor:', () { - test('Can construct with no input parameters using real logic. Which returns true for isRunningTests', () { - final runtimeEnvironmentInfo = RuntimeEnvironmentInfo(); - expect(runtimeEnvironmentInfo.isRunningInTestEnvironment(), true); - }); + testWidgets( + 'Can construct with no input parameters using real logic. Which returns true for isRunningTests', + (tester) async { + final runtimeEnvironmentInfo = RuntimeEnvironmentInfo(); + expect(runtimeEnvironmentInfo.isRunningInTestEnvironment(), true); + }, + ); }); }); } diff --git a/widget_driver/test/widget_driver_test.dart b/widget_driver/test/widget_driver_test.dart index 24f28c8..0eba62f 100644 --- a/widget_driver/test/widget_driver_test.dart +++ b/widget_driver/test/widget_driver_test.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:widget_driver/widget_driver.dart'; - -// ignore: avoid_relative_lib_imports -import '../../widget_driver_test/lib/widget_driver_test.dart'; +import 'package:widget_driver_test/widget_driver_test.dart'; void main() { group('WidgetDriver:', () {