chore(shorebird_code_push_protocol): Add metadata messages (#1823)

This commit is contained in:
Bryan Oltman
2024-03-27 18:03:07 -04:00
committed by GitHub
parent 54248bdc85
commit e98a0a7da0
18 changed files with 713 additions and 1 deletions
@@ -253,6 +253,8 @@ class CodePushClient {
wasForced: false,
hasAssetChanges: hasAssetChanges,
hasNativeChanges: hasNativeChanges,
// TODO(bryanoltman): add metadata
metadata: null,
);
final response = await _httpClient.post(
Uri.parse('$_v1/apps/$appId/patches'),
@@ -304,6 +306,8 @@ class CodePushClient {
UpdateReleaseRequest(
status: status,
platform: platform,
// TODO(bryanoltman): add metadata
metadata: null,
).toJson(),
),
);
@@ -1,4 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:shorebird_code_push_protocol/src/models/create_patch_metadata.dart';
part 'create_patch_request.g.dart';
@@ -13,6 +14,7 @@ class CreatePatchRequest {
required this.wasForced,
required this.hasAssetChanges,
required this.hasNativeChanges,
required this.metadata,
});
/// Converts a Map<String, dynamic> to a [CreatePatchRequest]
@@ -29,8 +31,13 @@ class CreatePatchRequest {
final bool? wasForced;
/// Whether the patch's assets were not the same as those of the release
// TODO(bryanoltman): remove this after metadata change is fully rolled out.
final bool? hasAssetChanges;
/// Whether the patch's native code is different than that of the release.
// TODO(bryanoltman): remove this after metadata change is fully rolled out.
final bool? hasNativeChanges;
/// Additional information about the creation of the patch.
final CreatePatchMetadata? metadata;
}
@@ -20,6 +20,11 @@ CreatePatchRequest _$CreatePatchRequestFromJson(Map<String, dynamic> json) =>
$checkedConvert('has_asset_changes', (v) => v as bool?),
hasNativeChanges:
$checkedConvert('has_native_changes', (v) => v as bool?),
metadata: $checkedConvert(
'metadata',
(v) => v == null
? null
: CreatePatchMetadata.fromJson(v as Map<String, dynamic>)),
);
return val;
},
@@ -37,4 +42,5 @@ Map<String, dynamic> _$CreatePatchRequestToJson(CreatePatchRequest instance) =>
'was_forced': instance.wasForced,
'has_asset_changes': instance.hasAssetChanges,
'has_native_changes': instance.hasNativeChanges,
'metadata': instance.metadata?.toJson(),
};
@@ -12,6 +12,7 @@ class UpdateReleaseRequest {
const UpdateReleaseRequest({
required this.status,
required this.platform,
required this.metadata,
});
/// Converts a Map<String, dynamic> to a [UpdateReleaseRequest].
@@ -26,4 +27,7 @@ class UpdateReleaseRequest {
/// The platform of the release.
final ReleasePlatform platform;
/// Additional information about the release.
final UpdateReleaseMetadata? metadata;
}
@@ -19,6 +19,11 @@ UpdateReleaseRequest _$UpdateReleaseRequestFromJson(
'status', (v) => $enumDecode(_$ReleaseStatusEnumMap, v)),
platform: $checkedConvert(
'platform', (v) => $enumDecode(_$ReleasePlatformEnumMap, v)),
metadata: $checkedConvert(
'metadata',
(v) => v == null
? null
: UpdateReleaseMetadata.fromJson(v as Map<String, dynamic>)),
);
return val;
},
@@ -29,6 +34,7 @@ Map<String, dynamic> _$UpdateReleaseRequestToJson(
<String, dynamic>{
'status': _$ReleaseStatusEnumMap[instance.status]!,
'platform': _$ReleasePlatformEnumMap[instance.platform]!,
'metadata': instance.metadata?.toJson(),
};
const _$ReleaseStatusEnumMap = {
@@ -0,0 +1,82 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'build_environment_metadata.g.dart';
/// {@template build_environment_metadata}
/// Information about the environment used to build a release or patch.
///
/// Collection of this information is done to help Shorebird users debug any
/// later failures in their builds.
///
/// We do not collect Personally Identifying Information (e.g. no paths,
/// argument lists, etc.) in accordance with our privacy policy:
/// https://shorebird.dev/privacy/
/// {@endtemplate}
@JsonSerializable()
class BuildEnvironmentMetadata extends Equatable {
/// {@macro build_environment_metadata}
const BuildEnvironmentMetadata({
required this.shorebirdVersion,
required this.operatingSystem,
required this.operatingSystemVersion,
required this.xcodeVersion,
});
/// coverage:ignore-start
/// Creates a [BuildEnvironmentMetadata] with overridable default values for
/// testing purposes.
factory BuildEnvironmentMetadata.forTest({
String shorebirdVersion = '4.5.6',
String operatingSystem = 'macos',
String operatingSystemVersion = '1.2.3',
String? xcodeVersion = '15.0',
}) =>
BuildEnvironmentMetadata(
shorebirdVersion: shorebirdVersion,
operatingSystem: operatingSystem,
operatingSystemVersion: operatingSystemVersion,
xcodeVersion: xcodeVersion,
);
// coverage:ignore-end
/// Converts a Map<String, dynamic> to a [BuildEnvironmentMetadata]
factory BuildEnvironmentMetadata.fromJson(Map<String, dynamic> json) =>
_$BuildEnvironmentMetadataFromJson(json);
/// Converts a [BuildEnvironmentMetadata] to a Map<String, dynamic>
Map<String, dynamic> toJson() => _$BuildEnvironmentMetadataToJson(this);
/// The version of Shorebird used to run the command.
///
/// Reason: each version of shorebird has new features and bug fixes. Users
/// using an older version may be running into issues that have already been
/// fixed.
final String shorebirdVersion;
/// The operating system used to run the release command.
///
/// Reason: issues may occur on some OSes and not others (especially Windows
/// vs non-Windows).
final String operatingSystem;
/// The version of [operatingSystem].
///
/// Reason: issues may occur on some OS versions and not others.
final String operatingSystemVersion;
/// The version of Xcode used to build the patch. Only provided for iOS
/// patches.
///
/// Reason: Xcode behavior can change between versions. Ex: the
/// `shorebird preview` mechanism changed entirely between Xcode 14 and 15.
final String? xcodeVersion;
@override
List<Object?> get props => [
shorebirdVersion,
operatingSystem,
operatingSystemVersion,
xcodeVersion,
];
}
@@ -0,0 +1,43 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: implicit_dynamic_parameter, require_trailing_commas, cast_nullable_to_non_nullable, lines_longer_than_80_chars
part of 'build_environment_metadata.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
BuildEnvironmentMetadata _$BuildEnvironmentMetadataFromJson(
Map<String, dynamic> json) =>
$checkedCreate(
'BuildEnvironmentMetadata',
json,
($checkedConvert) {
final val = BuildEnvironmentMetadata(
shorebirdVersion:
$checkedConvert('shorebird_version', (v) => v as String),
operatingSystem:
$checkedConvert('operating_system', (v) => v as String),
operatingSystemVersion:
$checkedConvert('operating_system_version', (v) => v as String),
xcodeVersion: $checkedConvert('xcode_version', (v) => v as String?),
);
return val;
},
fieldKeyMap: const {
'shorebirdVersion': 'shorebird_version',
'operatingSystem': 'operating_system',
'operatingSystemVersion': 'operating_system_version',
'xcodeVersion': 'xcode_version'
},
);
Map<String, dynamic> _$BuildEnvironmentMetadataToJson(
BuildEnvironmentMetadata instance) =>
<String, dynamic>{
'shorebird_version': instance.shorebirdVersion,
'operating_system': instance.operatingSystem,
'operating_system_version': instance.operatingSystemVersion,
'xcode_version': instance.xcodeVersion,
};
@@ -0,0 +1,100 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:shorebird_code_push_protocol/src/models/models.dart';
part 'create_patch_metadata.g.dart';
/// {@template create_patch_metadata}
/// Information about a patch, used for debugging purposes.
///
/// Collection of this information is done to help Shorebird users debug any
/// later failures in their builds.
///
/// We do not collect Personally Identifying Information (e.g. no paths,
/// argument lists, etc.) in accordance with our privacy policy:
/// https://shorebird.dev/privacy/
/// {@endtemplate}
@JsonSerializable()
class CreatePatchMetadata extends Equatable {
/// {@macro create_patch_metadata}
const CreatePatchMetadata({
required this.releasePlatform,
required this.usedIgnoreAssetChangesFlag,
required this.hasAssetChanges,
required this.usedIgnoreNativeChangesFlag,
required this.hasNativeChanges,
required this.environment,
});
// coverage:ignore-start
/// Creates a [CreatePatchMetadata] with overridable default values for
/// testing purposes.
factory CreatePatchMetadata.forTest({
ReleasePlatform releasePlatform = ReleasePlatform.android,
bool usedIgnoreAssetChangesFlag = false,
bool hasAssetChanges = false,
bool usedIgnoreNativeChangesFlag = false,
bool hasNativeChanges = false,
BuildEnvironmentMetadata? environment,
}) =>
CreatePatchMetadata(
releasePlatform: releasePlatform,
usedIgnoreAssetChangesFlag: usedIgnoreAssetChangesFlag,
hasAssetChanges: hasAssetChanges,
usedIgnoreNativeChangesFlag: usedIgnoreNativeChangesFlag,
hasNativeChanges: hasNativeChanges,
environment: environment ?? BuildEnvironmentMetadata.forTest(),
);
// coverage:ignore-end
/// Converts a Map<String, dynamic> to a [CreatePatchMetadata]
factory CreatePatchMetadata.fromJson(Map<String, dynamic> json) =>
_$CreatePatchMetadataFromJson(json);
/// Converts a [CreatePatchMetadata] to a Map<String, dynamic>
Map<String, dynamic> toJson() => _$CreatePatchMetadataToJson(this);
/// The platform for which the patch was created.
final ReleasePlatform releasePlatform;
/// Whether the `--allow-asset-diffs` flag was used.
///
/// Reason: this helps us understand how often prevalent the need to ignore
/// asset changes is.
final bool usedIgnoreAssetChangesFlag;
/// Whether asset changes were detected in the patch.
///
/// Reason: shorebird does not support asset changes in patches, and knowing
/// that asset changes were detected can help explain unexpected behavior in
/// a patch.
final bool hasAssetChanges;
/// Whether the `--allow-native-diffs` flag was used.
///
/// Reason: this helps us understand how often prevalent the need to ignore
/// native code changes is.
final bool usedIgnoreNativeChangesFlag;
/// Whether native code changes were detected in the patch.
///
/// Reason: shorebird does not support native code changes in patches, and
/// knowing that native code changes were detected can help explain unexpected
/// behavior in a patch.
final bool hasNativeChanges;
/// Properties about the environment in which the patch was created.
///
/// Reason: see [BuildEnvironmentMetadata].
final BuildEnvironmentMetadata environment;
@override
List<Object?> get props => [
releasePlatform,
usedIgnoreAssetChangesFlag,
hasAssetChanges,
usedIgnoreNativeChangesFlag,
hasNativeChanges,
environment,
];
}
@@ -0,0 +1,57 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: implicit_dynamic_parameter, require_trailing_commas, cast_nullable_to_non_nullable, lines_longer_than_80_chars
part of 'create_patch_metadata.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
CreatePatchMetadata _$CreatePatchMetadataFromJson(Map<String, dynamic> json) =>
$checkedCreate(
'CreatePatchMetadata',
json,
($checkedConvert) {
final val = CreatePatchMetadata(
releasePlatform: $checkedConvert('release_platform',
(v) => $enumDecode(_$ReleasePlatformEnumMap, v)),
usedIgnoreAssetChangesFlag: $checkedConvert(
'used_ignore_asset_changes_flag', (v) => v as bool),
hasAssetChanges:
$checkedConvert('has_asset_changes', (v) => v as bool),
usedIgnoreNativeChangesFlag: $checkedConvert(
'used_ignore_native_changes_flag', (v) => v as bool),
hasNativeChanges:
$checkedConvert('has_native_changes', (v) => v as bool),
environment: $checkedConvert(
'environment',
(v) =>
BuildEnvironmentMetadata.fromJson(v as Map<String, dynamic>)),
);
return val;
},
fieldKeyMap: const {
'releasePlatform': 'release_platform',
'usedIgnoreAssetChangesFlag': 'used_ignore_asset_changes_flag',
'hasAssetChanges': 'has_asset_changes',
'usedIgnoreNativeChangesFlag': 'used_ignore_native_changes_flag',
'hasNativeChanges': 'has_native_changes'
},
);
Map<String, dynamic> _$CreatePatchMetadataToJson(
CreatePatchMetadata instance) =>
<String, dynamic>{
'release_platform': _$ReleasePlatformEnumMap[instance.releasePlatform]!,
'used_ignore_asset_changes_flag': instance.usedIgnoreAssetChangesFlag,
'has_asset_changes': instance.hasAssetChanges,
'used_ignore_native_changes_flag': instance.usedIgnoreNativeChangesFlag,
'has_native_changes': instance.hasNativeChanges,
'environment': instance.environment.toJson(),
};
const _$ReleasePlatformEnumMap = {
ReleasePlatform.android: 'android',
ReleasePlatform.ios: 'ios',
};
@@ -1,11 +1,14 @@
export 'app.dart';
export 'app_metadata.dart';
export 'auth_provider.dart';
export 'build_environment_metadata.dart';
export 'channel.dart';
export 'create_patch_metadata.dart';
export 'error_response.dart';
export 'patch.dart';
export 'release.dart';
export 'release_artifact.dart';
export 'release_platform.dart';
export 'release_status.dart';
export 'update_release_metadata.dart';
export 'user.dart';
@@ -0,0 +1,80 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:shorebird_code_push_protocol/src/models/models.dart';
part 'update_release_metadata.g.dart';
/// {@template release_metadata}
/// Information about the creation of patch, used for debugging purposes.
///
/// Collection of this information is done to help Shorebird users debug any
/// later failures in their builds.
///
/// We do not collect Personally Identifying Information (e.g. no paths,
/// argument lists, etc.) in accordance with our privacy policy:
/// https://shorebird.dev/privacy/
/// {@endtemplate}
@JsonSerializable()
class UpdateReleaseMetadata extends Equatable {
/// {@macro release_metadata}
const UpdateReleaseMetadata({
required this.releasePlatform,
required this.flutterVersionOverride,
required this.generatedApks,
required this.environment,
});
// coverage:ignore-start
/// Creates a [UpdateReleaseMetadata] with overridable default values for
/// testing purposes.
factory UpdateReleaseMetadata.forTest({
ReleasePlatform releasePlatform = ReleasePlatform.android,
String? flutterVersionOverride = '1.2.3',
bool? generatedApks = false,
BuildEnvironmentMetadata? environment,
}) =>
UpdateReleaseMetadata(
releasePlatform: releasePlatform,
flutterVersionOverride: flutterVersionOverride,
generatedApks: generatedApks,
environment: environment ?? BuildEnvironmentMetadata.forTest(),
);
// coverage:ignore-end
/// Converts a Map<String, dynamic> to a [UpdateReleaseMetadata].
factory UpdateReleaseMetadata.fromJson(Map<String, dynamic> json) =>
_$UpdateReleaseMetadataFromJson(json);
/// Converts a [UpdateReleaseMetadata] to a Map<String, dynamic>.
Map<String, dynamic> toJson() => _$UpdateReleaseMetadataToJson(this);
/// The platform for which the patch was created.
final ReleasePlatform releasePlatform;
/// The Flutter version specified by the user, if any.
///
/// Reason: different Flutter versions have different performance
/// characteristics and features. Additionally, this helps us understand which
/// versions of Flutter are most commonly used.
final String? flutterVersionOverride;
/// Whether the user opted to generate an APK for the release (android-only).
///
/// Reason: if this flag is present, it produces different build artifacts,
/// which may affect the build process.
final bool? generatedApks;
/// Properties about the environment in which the update to the release was
/// performed.
///
/// Reason: see [BuildEnvironmentMetadata].
final BuildEnvironmentMetadata environment;
@override
List<Object?> get props => [
releasePlatform,
flutterVersionOverride,
generatedApks,
environment,
];
}
@@ -0,0 +1,49 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: implicit_dynamic_parameter, require_trailing_commas, cast_nullable_to_non_nullable, lines_longer_than_80_chars
part of 'update_release_metadata.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
UpdateReleaseMetadata _$UpdateReleaseMetadataFromJson(
Map<String, dynamic> json) =>
$checkedCreate(
'UpdateReleaseMetadata',
json,
($checkedConvert) {
final val = UpdateReleaseMetadata(
releasePlatform: $checkedConvert('release_platform',
(v) => $enumDecode(_$ReleasePlatformEnumMap, v)),
flutterVersionOverride:
$checkedConvert('flutter_version_override', (v) => v as String?),
generatedApks: $checkedConvert('generated_apks', (v) => v as bool?),
environment: $checkedConvert(
'environment',
(v) =>
BuildEnvironmentMetadata.fromJson(v as Map<String, dynamic>)),
);
return val;
},
fieldKeyMap: const {
'releasePlatform': 'release_platform',
'flutterVersionOverride': 'flutter_version_override',
'generatedApks': 'generated_apks'
},
);
Map<String, dynamic> _$UpdateReleaseMetadataToJson(
UpdateReleaseMetadata instance) =>
<String, dynamic>{
'release_platform': _$ReleasePlatformEnumMap[instance.releasePlatform]!,
'flutter_version_override': instance.flutterVersionOverride,
'generated_apks': instance.generatedApks,
'environment': instance.environment.toJson(),
};
const _$ReleasePlatformEnumMap = {
ReleasePlatform.android: 'android',
ReleasePlatform.ios: 'ios',
};
@@ -9,7 +9,8 @@ environment:
sdk: ">=3.0.0 <4.0.0"
dependencies:
json_annotation: ^4.8.1
equatable: ^2.0.5
json_annotation: ^4.8.1
dev_dependencies:
build_runner: ^2.0.0
@@ -9,6 +9,33 @@ void main() {
wasForced: true,
hasAssetChanges: true,
hasNativeChanges: false,
metadata: CreatePatchMetadata(
releasePlatform: ReleasePlatform.android,
usedIgnoreAssetChangesFlag: true,
usedIgnoreNativeChangesFlag: false,
hasAssetChanges: true,
hasNativeChanges: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'linux',
operatingSystemVersion: '1.0.0',
shorebirdVersion: '1.2.3',
xcodeVersion: null,
),
),
);
expect(
CreatePatchRequest.fromJson(request.toJson()).toJson(),
equals(request.toJson()),
);
});
test('can be (de)serialized without metadata', () {
const request = CreatePatchRequest(
releaseId: 1234,
wasForced: true,
hasAssetChanges: true,
hasNativeChanges: false,
metadata: null,
);
expect(
CreatePatchRequest.fromJson(request.toJson()).toJson(),
@@ -7,6 +7,29 @@ void main() {
const request = UpdateReleaseRequest(
platform: ReleasePlatform.android,
status: ReleaseStatus.active,
metadata: UpdateReleaseMetadata(
releasePlatform: ReleasePlatform.ios,
flutterVersionOverride: null,
generatedApks: null,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '11.1',
shorebirdVersion: '1.2.3',
xcodeVersion: '15.3',
),
),
);
expect(
UpdateReleaseRequest.fromJson(request.toJson()).toJson(),
equals(request.toJson()),
);
});
test('can be (de)serialized without metadata', () {
const request = UpdateReleaseRequest(
platform: ReleasePlatform.ios,
status: ReleaseStatus.active,
metadata: null,
);
expect(
UpdateReleaseRequest.fromJson(request.toJson()).toJson(),
@@ -0,0 +1,54 @@
import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart';
import 'package:shorebird_code_push_protocol/src/models/build_environment_metadata.dart';
import 'package:test/test.dart';
void main() {
group(BuildEnvironmentMetadata, () {
test('can be (de)serialized', () {
const metadata = BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
);
expect(
BuildEnvironmentMetadata.fromJson(metadata.toJson()).toJson(),
equals(metadata.toJson()),
);
});
group('equatable', () {
test('two metadatas with the same properties are equal', () {
const metadata = BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
);
const otherMetadata = BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
);
expect(metadata, equals(otherMetadata));
});
test('two metadatas with different properties are not equal', () {
const metadata = BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
);
const otherMetadata = BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.1',
);
expect(metadata, isNot(equals(otherMetadata)));
});
});
});
}
@@ -0,0 +1,88 @@
import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart';
import 'package:test/test.dart';
void main() {
group(CreatePatchMetadata, () {
test('can be (de)serialized', () {
const metadata = CreatePatchMetadata(
releasePlatform: ReleasePlatform.android,
usedIgnoreAssetChangesFlag: false,
hasAssetChanges: false,
usedIgnoreNativeChangesFlag: false,
hasNativeChanges: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
expect(
CreatePatchMetadata.fromJson(metadata.toJson()).toJson(),
equals(metadata.toJson()),
);
});
group('equatable', () {
test('two metadatas with the same properties are equal', () {
const metadata = CreatePatchMetadata(
releasePlatform: ReleasePlatform.android,
usedIgnoreAssetChangesFlag: false,
hasAssetChanges: false,
usedIgnoreNativeChangesFlag: false,
hasNativeChanges: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
const otherMetadata = CreatePatchMetadata(
releasePlatform: ReleasePlatform.android,
usedIgnoreAssetChangesFlag: false,
hasAssetChanges: false,
usedIgnoreNativeChangesFlag: false,
hasNativeChanges: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
expect(metadata, equals(otherMetadata));
});
test('two metadatas with different properties are not equal', () {
const metadata = CreatePatchMetadata(
releasePlatform: ReleasePlatform.android,
usedIgnoreAssetChangesFlag: false,
hasAssetChanges: false,
usedIgnoreNativeChangesFlag: false,
hasNativeChanges: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
const otherMetadata = CreatePatchMetadata(
releasePlatform: ReleasePlatform.ios,
usedIgnoreAssetChangesFlag: false,
hasAssetChanges: false,
usedIgnoreNativeChangesFlag: false,
hasNativeChanges: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
expect(metadata, isNot(equals(otherMetadata)));
});
});
});
}
@@ -0,0 +1,78 @@
import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart';
import 'package:test/test.dart';
void main() {
group(UpdateReleaseMetadata, () {
test('can be (de)serialized', () {
const metadata = UpdateReleaseMetadata(
releasePlatform: ReleasePlatform.android,
flutterVersionOverride: '1.2.3',
generatedApks: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
expect(
UpdateReleaseMetadata.fromJson(metadata.toJson()).toJson(),
equals(metadata.toJson()),
);
});
group('equatable', () {
test('two metadatas with the same properties are equal', () {
const metadata = UpdateReleaseMetadata(
releasePlatform: ReleasePlatform.android,
flutterVersionOverride: '1.2.3',
generatedApks: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
const otherMetadata = UpdateReleaseMetadata(
releasePlatform: ReleasePlatform.android,
flutterVersionOverride: '1.2.3',
generatedApks: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
expect(metadata, equals(otherMetadata));
});
test('two metadatas with different properties are not equal', () {
const metadata = UpdateReleaseMetadata(
releasePlatform: ReleasePlatform.android,
flutterVersionOverride: '1.2.3',
generatedApks: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
const otherMetadata = UpdateReleaseMetadata(
releasePlatform: ReleasePlatform.android,
flutterVersionOverride: '1.2.4',
generatedApks: false,
environment: BuildEnvironmentMetadata(
operatingSystem: 'macos',
operatingSystemVersion: '1.2.3',
shorebirdVersion: '4.5.6',
xcodeVersion: '15.0',
),
);
expect(metadata, isNot(equals(otherMetadata)));
});
});
});
}