chore: remove flutter version check from doctor (#2735)

This commit is contained in:
Bryan Oltman
2024-12-30 14:26:53 -05:00
committed by GitHub
parent 19ef47b6b1
commit 061f860b18
13 changed files with 41 additions and 423 deletions
@@ -32,7 +32,6 @@ class Doctor {
/// Validators that should run on all commands.
List<Validator> generalValidators = [
ShorebirdVersionValidator(),
ShorebirdFlutterValidator(),
AndroidInternetPermissionValidator(),
MacosNetworkEntitlementValidator(),
ShorebirdYamlAssetValidator(),
@@ -1,134 +0,0 @@
import 'dart:io';
import 'package:pub_semver/pub_semver.dart';
import 'package:shorebird_cli/src/platform.dart';
import 'package:shorebird_cli/src/shorebird_env.dart';
import 'package:shorebird_cli/src/shorebird_flutter.dart';
import 'package:shorebird_cli/src/validators/validators.dart';
/// An exception thrown when a validation issue is found.
class FlutterValidationException implements Exception {
/// Creates a new [FlutterValidationException] with the provided [message].
const FlutterValidationException(this.message);
/// The message associated with the exception.
final String message;
@override
String toString() => 'FlutterValidationException: $message';
}
/// An exception thrown when a command is not found.
class CommandNotFoundException implements Exception {}
/// {@template shorebird_flutter_validator}
/// Compares the version of Flutter that Shorebird includes with the version
/// of Flutter on the user's path. Will error if no system Flutter is found, and
/// will warn if major or minor versions differ.
/// {@endtemplate}
class ShorebirdFlutterValidator extends Validator {
/// {@macro shorebird_flutter_validator}
ShorebirdFlutterValidator();
@override
String get description => 'Flutter install is correct';
@override
Future<List<ValidationIssue>> validate() async {
final issues = <ValidationIssue>[];
if (!shorebirdEnv.flutterDirectory.existsSync()) {
final message =
'No Flutter directory found at ${shorebirdEnv.flutterDirectory}';
issues.add(ValidationIssue.error(message: message));
}
if (!await shorebirdFlutter.isUnmodified()) {
issues.add(
ValidationIssue.warning(
message: '${shorebirdEnv.flutterDirectory} has local modifications',
),
);
}
String? shorebirdFlutterVersionString;
try {
shorebirdFlutterVersionString = await _getFlutterVersion();
} on Exception catch (error) {
issues.add(
ValidationIssue.error(
message: 'Failed to determine Shorebird Flutter version. $error',
),
);
}
String? pathFlutterVersionString;
try {
pathFlutterVersionString = await _getFlutterVersion(
useVendedFlutter: false,
);
} on CommandNotFoundException catch (_) {
// If there is no system Flutter, we don't throw a validation exception.
} on Exception catch (error) {
issues.add(
ValidationIssue.error(
message: 'Failed to determine path Flutter version. $error',
),
);
}
if (shorebirdFlutterVersionString != null &&
pathFlutterVersionString != null) {
final shorebirdFlutterVersion =
Version.parse(shorebirdFlutterVersionString);
final pathFlutterVersion = Version.parse(pathFlutterVersionString);
if (shorebirdFlutterVersion.major != pathFlutterVersion.major ||
shorebirdFlutterVersion.minor != pathFlutterVersion.minor) {
final message = '''
The version of Flutter that Shorebird includes and the Flutter on your path are different.
\tShorebird Flutter: $shorebirdFlutterVersionString
\tSystem Flutter: $pathFlutterVersionString
This can cause unexpected behavior if you are switching between the tools and the version gap is wide. If you have any trouble, please let us know on Shorebird discord.''';
issues.add(ValidationIssue.warning(message: message));
}
}
final flutterStorageEnvironmentValue =
platform.environment['FLUTTER_STORAGE_BASE_URL'];
if (flutterStorageEnvironmentValue != null &&
flutterStorageEnvironmentValue.isNotEmpty) {
issues.add(
ValidationIssue.warning(
message: 'Shorebird does not respect the FLUTTER_STORAGE_BASE_URL '
'environment variable at this time',
),
);
}
return issues;
}
Future<String> _getFlutterVersion({bool useVendedFlutter = true}) async {
final String? version;
try {
version = useVendedFlutter
? await shorebirdFlutter.getVersionString()
: await shorebirdFlutter.getSystemVersion();
} on ProcessException catch (error) {
if (error.errorCode == 127) throw CommandNotFoundException();
throw FlutterValidationException(
'Flutter version check did not complete successfully. ${error.message}',
);
}
if (version == null) {
throw const FlutterValidationException(
'Could not detect version number in output',
);
}
return version;
}
}
@@ -7,7 +7,6 @@ import 'package:shorebird_cli/src/shorebird_process.dart';
export 'android_internet_permission_validator.dart';
export 'flavor_validator.dart';
export 'macos_network_entitlement_validator.dart';
export 'shorebird_flutter_validator.dart';
export 'shorebird_version_validator.dart';
export 'shorebird_yaml_asset_validator.dart';
@@ -46,10 +46,10 @@ void main() {
late CodeSigner codeSigner;
late Doctor doctor;
late Directory projectRoot;
late FlavorValidator flavorValidator;
late ShorebirdLogger logger;
late PatchDiffChecker patchDiffChecker;
late Progress progress;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -125,11 +125,11 @@ void main() {
codePushClientWrapper = MockCodePushClientWrapper();
codeSigner = MockCodeSigner();
doctor = MockDoctor();
flavorValidator = MockFlavorValidator();
patchDiffChecker = MockPatchDiffChecker();
progress = MockProgress();
projectRoot = Directory.systemTemp.createTempSync();
logger = MockShorebirdLogger();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
shorebirdFlutter = MockShorebirdFlutter();
@@ -163,8 +163,8 @@ void main() {
group('assertPreconditions', () {
setUp(() {
when(() => doctor.androidCommandValidators)
.thenReturn([flutterValidator]);
when(flutterValidator.validate).thenAnswer((_) async => []);
.thenReturn([flavorValidator]);
when(flavorValidator.validate).thenAnswer((_) async => []);
});
group('when validation succeeds', () {
@@ -220,7 +220,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
),
).called(1);
});
@@ -48,15 +48,15 @@ void main() {
late ArtifactManager artifactManager;
late CodePushClientWrapper codePushClientWrapper;
late Doctor doctor;
late EngineConfig engineConfig;
late Directory flutterDirectory;
late Directory projectRoot;
late EngineConfig engineConfig;
late FlavorValidator flavorValidator;
late ShorebirdLogger logger;
late OperatingSystemInterface operatingSystemInterface;
late PatchDiffChecker patchDiffChecker;
late Progress progress;
late ShorebirdArtifacts shorebirdArtifacts;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -105,6 +105,7 @@ void main() {
codePushClientWrapper = MockCodePushClientWrapper();
doctor = MockDoctor();
engineConfig = MockEngineConfig();
flavorValidator = MockFlavorValidator();
operatingSystemInterface = MockOperatingSystemInterface();
patchDiffChecker = MockPatchDiffChecker();
progress = MockProgress();
@@ -113,7 +114,6 @@ void main() {
shorebirdArtifacts = MockShorebirdArtifacts();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdFlutter = MockShorebirdFlutter();
shorebirdValidator = MockShorebirdValidator();
xcodeBuild = MockXcodeBuild();
@@ -183,7 +183,7 @@ void main() {
setUp(() {
when(
() => doctor.iosCommandValidators,
).thenReturn([flutterValidator]);
).thenReturn([flavorValidator]);
});
group('when validation succeeds', () {
@@ -249,7 +249,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
supportedOperatingSystems: {Platform.macOS},
),
).called(1);
@@ -55,15 +55,15 @@ void main() {
late CodePushClientWrapper codePushClientWrapper;
late CodeSigner codeSigner;
late Doctor doctor;
late EngineConfig engineConfig;
late Directory flutterDirectory;
late Directory projectRoot;
late EngineConfig engineConfig;
late FlavorValidator flavorValidator;
late ShorebirdLogger logger;
late OperatingSystemInterface operatingSystemInterface;
late PatchDiffChecker patchDiffChecker;
late Progress progress;
late ShorebirdArtifacts shorebirdArtifacts;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -117,6 +117,7 @@ void main() {
codeSigner = MockCodeSigner();
doctor = MockDoctor();
engineConfig = MockEngineConfig();
flavorValidator = MockFlavorValidator();
ios = MockIos();
operatingSystemInterface = MockOperatingSystemInterface();
patchDiffChecker = MockPatchDiffChecker();
@@ -126,7 +127,6 @@ void main() {
shorebirdArtifacts = MockShorebirdArtifacts();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdFlutter = MockShorebirdFlutter();
shorebirdValidator = MockShorebirdValidator();
xcodeBuild = MockXcodeBuild();
@@ -195,7 +195,7 @@ void main() {
setUp(() {
when(
() => doctor.iosCommandValidators,
).thenReturn([flutterValidator]);
).thenReturn([flavorValidator]);
});
group('when validation succeeds', () {
@@ -266,7 +266,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
supportedOperatingSystems: {Platform.macOS},
),
).called(1);
@@ -59,12 +59,12 @@ void main() {
late Directory flutterDirectory;
late Directory projectRoot;
late Directory appDirectory;
late FlavorValidator flavorValidator;
late ShorebirdLogger logger;
late OperatingSystemInterface operatingSystemInterface;
late PatchDiffChecker patchDiffChecker;
late Progress progress;
late ShorebirdArtifacts shorebirdArtifacts;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -117,6 +117,7 @@ void main() {
codeSigner = MockCodeSigner();
doctor = MockDoctor();
engineConfig = MockEngineConfig();
flavorValidator = MockFlavorValidator();
operatingSystemInterface = MockOperatingSystemInterface();
patchDiffChecker = MockPatchDiffChecker();
progress = MockProgress();
@@ -125,7 +126,6 @@ void main() {
shorebirdArtifacts = MockShorebirdArtifacts();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdFlutter = MockShorebirdFlutter();
shorebirdValidator = MockShorebirdValidator();
xcodeBuild = MockXcodeBuild();
@@ -222,7 +222,7 @@ void main() {
setUp(() {
when(
() => doctor.macosCommandValidators,
).thenReturn([flutterValidator]);
).thenReturn([flavorValidator]);
});
group('when validation succeeds', () {
@@ -293,7 +293,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
supportedOperatingSystems: {Platform.macOS},
),
).called(1);
@@ -39,10 +39,10 @@ void main() {
late CodeSigner codeSigner;
late Doctor doctor;
late Directory projectRoot;
late FlavorValidator flavorValidator;
late ShorebirdLogger logger;
late OperatingSystemInterface operatingSystemInterface;
late Progress progress;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -83,11 +83,11 @@ void main() {
codePushClientWrapper = MockCodePushClientWrapper();
codeSigner = MockCodeSigner();
doctor = MockDoctor();
flavorValidator = MockFlavorValidator();
operatingSystemInterface = MockOperatingSystemInterface();
progress = MockProgress();
projectRoot = Directory.systemTemp.createTempSync();
logger = MockShorebirdLogger();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
shorebirdFlutter = MockShorebirdFlutter();
@@ -121,8 +121,8 @@ void main() {
group('assertPreconditions', () {
setUp(() {
when(() => doctor.androidCommandValidators)
.thenReturn([flutterValidator]);
when(flutterValidator.validate).thenAnswer((_) async => []);
.thenReturn([flavorValidator]);
when(flavorValidator.validate).thenAnswer((_) async => []);
});
group('when validation succeeds', () {
@@ -178,7 +178,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
),
).called(1);
});
@@ -42,10 +42,10 @@ void main() {
late CodePushClientWrapper codePushClientWrapper;
late Doctor doctor;
late Directory projectRoot;
late FlavorValidator flavorValidator;
late ShorebirdLogger logger;
late OperatingSystemInterface operatingSystemInterface;
late Progress progress;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -83,13 +83,13 @@ void main() {
artifactManager = MockArtifactManager();
codePushClientWrapper = MockCodePushClientWrapper();
doctor = MockDoctor();
flavorValidator = MockFlavorValidator();
operatingSystemInterface = MockOperatingSystemInterface();
progress = MockProgress();
projectRoot = Directory.systemTemp.createTempSync();
logger = MockShorebirdLogger();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdFlutter = MockShorebirdFlutter();
shorebirdValidator = MockShorebirdValidator();
xcodeBuild = MockXcodeBuild();
@@ -159,10 +159,10 @@ void main() {
setUp(() {
when(
() => doctor.iosCommandValidators,
).thenReturn([flutterValidator]);
).thenReturn([flavorValidator]);
when(() => shorebirdFlutter.resolveFlutterVersion(any()))
.thenAnswer((_) async => flutterVersion);
when(flutterValidator.validate).thenAnswer((_) async => []);
when(flavorValidator.validate).thenAnswer((_) async => []);
});
group('when validation succeeds', () {
@@ -220,7 +220,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
supportedOperatingSystems: {Platform.macOS},
),
).called(1);
@@ -47,11 +47,11 @@ void main() {
late CodeSigner codeSigner;
late Directory projectRoot;
late Doctor doctor;
late FlavorValidator flavorValidator;
late Progress progress;
late ShorebirdLogger logger;
late Ios ios;
late OperatingSystemInterface operatingSystemInterface;
late ShorebirdFlutterValidator flutterValidator;
late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
@@ -93,12 +93,12 @@ void main() {
codePushClientWrapper = MockCodePushClientWrapper();
codeSigner = MockCodeSigner();
doctor = MockDoctor();
flavorValidator = MockFlavorValidator();
projectRoot = Directory.systemTemp.createTempSync();
operatingSystemInterface = MockOperatingSystemInterface();
progress = MockProgress();
logger = MockShorebirdLogger();
ios = MockIos();
flutterValidator = MockShorebirdFlutterValidator();
shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
shorebirdFlutter = MockShorebirdFlutter();
@@ -127,11 +127,10 @@ void main() {
final flutterVersion = Version(3, 0, 0);
setUp(() {
when(() => doctor.iosCommandValidators)
.thenReturn([flutterValidator]);
when(() => doctor.iosCommandValidators).thenReturn([flavorValidator]);
when(() => shorebirdFlutter.resolveFlutterVersion(any()))
.thenAnswer((_) async => flutterVersion);
when(flutterValidator.validate).thenAnswer((_) async => []);
when(flavorValidator.validate).thenAnswer((_) async => []);
});
group('when validation succeeds', () {
@@ -183,7 +182,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
supportedOperatingSystems: {Platform.macOS},
),
).called(1);
@@ -40,14 +40,11 @@ void main() {
late ArtifactBuilder artifactBuilder;
late ArtifactManager artifactManager;
late CodePushClientWrapper codePushClientWrapper;
// late CodeSigner codeSigner;
late Directory projectRoot;
late Doctor doctor;
late FlavorValidator flavorValidator;
late Progress progress;
late ShorebirdLogger logger;
// late OperatingSystemInterface operatingSystemInterface;
late ShorebirdFlutterValidator flutterValidator;
// late ShorebirdProcess shorebirdProcess;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
late ShorebirdValidator shorebirdValidator;
@@ -62,12 +59,8 @@ void main() {
artifactBuilderRef.overrideWith(() => artifactBuilder),
artifactManagerRef.overrideWith(() => artifactManager),
codePushClientWrapperRef.overrideWith(() => codePushClientWrapper),
// codeSignerRef.overrideWith(() => codeSigner),
doctorRef.overrideWith(() => doctor),
// iosRef.overrideWith(() => ios),
loggerRef.overrideWith(() => logger),
// osInterfaceRef.overrideWith(() => operatingSystemInterface),
// processRef.overrideWith(() => shorebirdProcess),
shorebirdEnvRef.overrideWith(() => shorebirdEnv),
shorebirdFlutterRef.overrideWith(() => shorebirdFlutter),
shorebirdValidatorRef.overrideWith(() => shorebirdValidator),
@@ -81,15 +74,11 @@ void main() {
artifactBuilder = MockArtifactBuilder();
artifactManager = MockArtifactManager();
codePushClientWrapper = MockCodePushClientWrapper();
// codeSigner = MockCodeSigner();
doctor = MockDoctor();
flavorValidator = MockFlavorValidator();
projectRoot = Directory.systemTemp.createTempSync();
// operatingSystemInterface = MockOperatingSystemInterface();
progress = MockProgress();
logger = MockShorebirdLogger();
// ios = MockIos();
flutterValidator = MockShorebirdFlutterValidator();
// shorebirdProcess = MockShorebirdProcess();
shorebirdEnv = MockShorebirdEnv();
shorebirdFlutter = MockShorebirdFlutter();
shorebirdValidator = MockShorebirdValidator();
@@ -118,10 +107,10 @@ void main() {
setUp(() {
when(() => doctor.macosCommandValidators)
.thenReturn([flutterValidator]);
.thenReturn([flavorValidator]);
when(() => shorebirdFlutter.resolveFlutterVersion(any()))
.thenAnswer((_) async => flutterVersion);
when(flutterValidator.validate).thenAnswer((_) async => []);
when(flavorValidator.validate).thenAnswer((_) async => []);
});
group('when validation succeeds', () {
@@ -173,7 +162,7 @@ void main() {
() => shorebirdValidator.validatePreconditions(
checkUserIsAuthenticated: true,
checkShorebirdInitialized: true,
validators: [flutterValidator],
validators: [flavorValidator],
supportedOperatingSystems: {Platform.macOS},
),
).called(1);
+2 -3
View File
@@ -95,6 +95,8 @@ class MockFile extends Mock implements File {}
class MockFileSetDiff extends Mock implements FileSetDiff {}
class MockFlavorValidator extends Mock implements FlavorValidator {}
class MockGit extends Mock implements Git {}
class MockGradlew extends Mock implements Gradlew {}
@@ -157,9 +159,6 @@ class MockShorebirdEnv extends Mock implements ShorebirdEnv {}
class MockShorebirdFlutter extends Mock implements ShorebirdFlutter {}
class MockShorebirdFlutterValidator extends Mock
implements ShorebirdFlutterValidator {}
class MockShorebirdLogger extends Mock implements ShorebirdLogger {}
class MockShorebirdProcess extends Mock implements ShorebirdProcess {}
@@ -1,233 +0,0 @@
import 'dart:io' hide Platform;
import 'package:mocktail/mocktail.dart';
import 'package:path/path.dart' as p;
import 'package:platform/platform.dart';
import 'package:scoped_deps/scoped_deps.dart';
import 'package:shorebird_cli/src/platform.dart';
import 'package:shorebird_cli/src/shorebird_env.dart';
import 'package:shorebird_cli/src/shorebird_flutter.dart';
import 'package:shorebird_cli/src/validators/validators.dart';
import 'package:test/test.dart';
import '../mocks.dart';
void main() {
group(ShorebirdFlutterValidator, () {
const flutterRevision = '45fc514f1a9c347a3af76b02baf980a4d88b7879';
const flutterVersion = '3.7.9';
late ShorebirdFlutterValidator validator;
late Directory tempDir;
late ShorebirdEnv shorebirdEnv;
late ShorebirdFlutter shorebirdFlutter;
late Platform platform;
R runWithOverrides<R>(R Function() body) {
return runScoped(
() => body(),
values: {
platformRef.overrideWith(() => platform),
shorebirdEnvRef.overrideWith(() => shorebirdEnv),
shorebirdFlutterRef.overrideWith(() => shorebirdFlutter),
},
);
}
Directory flutterDirectory(Directory root) =>
Directory(p.join(root.path, 'bin', 'cache', 'flutter'));
Directory setupTempDirectory() {
final tempDir = Directory.systemTemp.createTempSync();
flutterDirectory(tempDir).createSync(recursive: true);
return tempDir;
}
setUp(() {
tempDir = setupTempDirectory();
platform = MockPlatform();
shorebirdEnv = MockShorebirdEnv();
shorebirdFlutter = MockShorebirdFlutter();
when(() => shorebirdEnv.flutterRevision).thenReturn(flutterRevision);
when(
() => shorebirdEnv.flutterDirectory,
).thenReturn(flutterDirectory(tempDir));
when(() => platform.environment).thenReturn({});
when(
() => shorebirdFlutter.getVersionString(),
).thenAnswer((_) async => flutterVersion);
when(
() => shorebirdFlutter.getSystemVersion(),
).thenAnswer((_) async => flutterVersion);
validator = ShorebirdFlutterValidator();
when(
() => shorebirdFlutter.isUnmodified(
revision: any(named: 'revision'),
),
).thenAnswer((_) async => true);
});
test('has a non-empty description', () {
expect(validator.description, isNotEmpty);
});
test('canRunInContext always returns true', () {
expect(validator.canRunInCurrentContext(), isTrue);
});
test('returns no issues when the Flutter install is good', () async {
final results = await runWithOverrides(validator.validate);
expect(results, isEmpty);
});
test('errors when Flutter does not exist', () async {
flutterDirectory(tempDir).deleteSync();
final results = await runWithOverrides(validator.validate);
expect(results, hasLength(1));
expect(results.first.severity, ValidationIssueSeverity.error);
expect(results.first.message, contains('No Flutter directory found'));
});
test('warns when Flutter has local modifications', () async {
when(
() => shorebirdFlutter.isUnmodified(
revision: any(named: 'revision'),
),
).thenAnswer((_) async => false);
final results = await runWithOverrides(validator.validate);
expect(results, hasLength(1));
expect(results.first.severity, ValidationIssueSeverity.warning);
expect(results.first.message, contains('has local modifications'));
});
test(
'does not warn if system flutter does not exist',
() async {
when(
() => shorebirdFlutter.getSystemVersion(),
).thenThrow(const ProcessException('flutter', ['--version'], '', 127));
final results = await runWithOverrides(
() => validator.validate(),
);
expect(results, isEmpty);
},
);
test(
'does not warn if flutter version and shorebird flutter version have same'
' major and minor but different patch versions',
() async {
when(
() => shorebirdFlutter.getSystemVersion(),
).thenAnswer((_) async => '3.7.10');
final results = await runWithOverrides(
() => validator.validate(),
);
expect(results, isEmpty);
},
);
test(
'warns when path flutter version has different major or minor version '
'than shorebird flutter',
() async {
when(
() => shorebirdFlutter.getSystemVersion(),
).thenAnswer((_) async => '3.8.9');
final results = await runWithOverrides(validator.validate);
expect(results, hasLength(1));
expect(results.first.severity, ValidationIssueSeverity.warning);
expect(
results.first.message,
contains(
'The version of Flutter that Shorebird includes and the Flutter on '
'your path are different',
),
);
},
);
test(
'warns if FLUTTER_STORAGE_BASE_URL has a non-empty value',
() async {
when(() => platform.environment).thenReturn(
{'FLUTTER_STORAGE_BASE_URL': 'https://storage.flutter-io.cn'},
);
final results = await runWithOverrides(validator.validate);
expect(results, hasLength(1));
expect(results.first.severity, ValidationIssueSeverity.warning);
expect(
results.first.message,
contains(
'Shorebird does not respect the FLUTTER_STORAGE_BASE_URL '
'environment variable',
),
);
},
);
test('throws exception if path flutter version lookup fails', () async {
when(() => shorebirdFlutter.getSystemVersion()).thenThrow(
const ProcessException(
'flutter',
['--version'],
'OH NO THERE IS NO FLUTTER VERSION HERE',
1,
),
);
final results = await runWithOverrides(validator.validate);
expect(results, hasLength(1));
expect(
results[0],
isA<ValidationIssue>().having(
(exception) => exception.message,
'message',
contains('Failed to determine path Flutter version'),
),
);
});
test('throws exception if shorebird flutter version lookup fails',
() async {
when(
() => shorebirdFlutter.getVersionString(),
).thenThrow(
const ProcessException(
'flutter',
['--version'],
'OH NO THERE IS NO FLUTTER VERSION HERE',
1,
),
);
final results = await runWithOverrides(validator.validate);
expect(results, hasLength(1));
expect(
results[0],
isA<ValidationIssue>().having(
(exception) => exception.message,
'message',
contains('Failed to determine Shorebird Flutter version'),
),
);
});
});
}