diff --git a/packages/shorebird_code_push_client/lib/src/code_push_client.dart b/packages/shorebird_code_push_client/lib/src/code_push_client.dart index 078ffb213..e7fc4ded3 100644 --- a/packages/shorebird_code_push_client/lib/src/code_push_client.dart +++ b/packages/shorebird_code_push_client/lib/src/code_push_client.dart @@ -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(), ), ); diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.dart b/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.dart index 00fda9368..ea461b2d7 100644 --- a/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.dart +++ b/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.dart @@ -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 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; } diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.g.dart b/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.g.dart index 99005e597..23fe70b60 100644 --- a/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.g.dart +++ b/packages/shorebird_code_push_protocol/lib/src/messages/create_patch/create_patch_request.g.dart @@ -20,6 +20,11 @@ CreatePatchRequest _$CreatePatchRequestFromJson(Map 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)), ); return val; }, @@ -37,4 +42,5 @@ Map _$CreatePatchRequestToJson(CreatePatchRequest instance) => 'was_forced': instance.wasForced, 'has_asset_changes': instance.hasAssetChanges, 'has_native_changes': instance.hasNativeChanges, + 'metadata': instance.metadata?.toJson(), }; diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.dart b/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.dart index 334baf8e0..801c8bfcb 100644 --- a/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.dart +++ b/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.dart @@ -12,6 +12,7 @@ class UpdateReleaseRequest { const UpdateReleaseRequest({ required this.status, required this.platform, + required this.metadata, }); /// Converts a Map 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; } diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.g.dart b/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.g.dart index 220a0ec31..c2244c7df 100644 --- a/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.g.dart +++ b/packages/shorebird_code_push_protocol/lib/src/messages/update_release/update_release_request.g.dart @@ -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)), ); return val; }, @@ -29,6 +34,7 @@ Map _$UpdateReleaseRequestToJson( { 'status': _$ReleaseStatusEnumMap[instance.status]!, 'platform': _$ReleasePlatformEnumMap[instance.platform]!, + 'metadata': instance.metadata?.toJson(), }; const _$ReleaseStatusEnumMap = { diff --git a/packages/shorebird_code_push_protocol/lib/src/models/build_environment_metadata.dart b/packages/shorebird_code_push_protocol/lib/src/models/build_environment_metadata.dart new file mode 100644 index 000000000..73bd98640 --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/build_environment_metadata.dart @@ -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 to a [BuildEnvironmentMetadata] + factory BuildEnvironmentMetadata.fromJson(Map json) => + _$BuildEnvironmentMetadataFromJson(json); + + /// Converts a [BuildEnvironmentMetadata] to a Map + Map 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 get props => [ + shorebirdVersion, + operatingSystem, + operatingSystemVersion, + xcodeVersion, + ]; +} diff --git a/packages/shorebird_code_push_protocol/lib/src/models/build_environment_metadata.g.dart b/packages/shorebird_code_push_protocol/lib/src/models/build_environment_metadata.g.dart new file mode 100644 index 000000000..5f2614111 --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/build_environment_metadata.g.dart @@ -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 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 _$BuildEnvironmentMetadataToJson( + BuildEnvironmentMetadata instance) => + { + 'shorebird_version': instance.shorebirdVersion, + 'operating_system': instance.operatingSystem, + 'operating_system_version': instance.operatingSystemVersion, + 'xcode_version': instance.xcodeVersion, + }; diff --git a/packages/shorebird_code_push_protocol/lib/src/models/create_patch_metadata.dart b/packages/shorebird_code_push_protocol/lib/src/models/create_patch_metadata.dart new file mode 100644 index 000000000..adbe5d10e --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/create_patch_metadata.dart @@ -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 to a [CreatePatchMetadata] + factory CreatePatchMetadata.fromJson(Map json) => + _$CreatePatchMetadataFromJson(json); + + /// Converts a [CreatePatchMetadata] to a Map + Map 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 get props => [ + releasePlatform, + usedIgnoreAssetChangesFlag, + hasAssetChanges, + usedIgnoreNativeChangesFlag, + hasNativeChanges, + environment, + ]; +} diff --git a/packages/shorebird_code_push_protocol/lib/src/models/create_patch_metadata.g.dart b/packages/shorebird_code_push_protocol/lib/src/models/create_patch_metadata.g.dart new file mode 100644 index 000000000..e9e00d87f --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/create_patch_metadata.g.dart @@ -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 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)), + ); + 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 _$CreatePatchMetadataToJson( + CreatePatchMetadata instance) => + { + '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', +}; diff --git a/packages/shorebird_code_push_protocol/lib/src/models/models.dart b/packages/shorebird_code_push_protocol/lib/src/models/models.dart index 5a8129899..9992e99c2 100644 --- a/packages/shorebird_code_push_protocol/lib/src/models/models.dart +++ b/packages/shorebird_code_push_protocol/lib/src/models/models.dart @@ -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'; diff --git a/packages/shorebird_code_push_protocol/lib/src/models/update_release_metadata.dart b/packages/shorebird_code_push_protocol/lib/src/models/update_release_metadata.dart new file mode 100644 index 000000000..3d8038fe1 --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/update_release_metadata.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 to a [UpdateReleaseMetadata]. + factory UpdateReleaseMetadata.fromJson(Map json) => + _$UpdateReleaseMetadataFromJson(json); + + /// Converts a [UpdateReleaseMetadata] to a Map. + Map 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 get props => [ + releasePlatform, + flutterVersionOverride, + generatedApks, + environment, + ]; +} diff --git a/packages/shorebird_code_push_protocol/lib/src/models/update_release_metadata.g.dart b/packages/shorebird_code_push_protocol/lib/src/models/update_release_metadata.g.dart new file mode 100644 index 000000000..e15205d11 --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/models/update_release_metadata.g.dart @@ -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 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)), + ); + return val; + }, + fieldKeyMap: const { + 'releasePlatform': 'release_platform', + 'flutterVersionOverride': 'flutter_version_override', + 'generatedApks': 'generated_apks' + }, + ); + +Map _$UpdateReleaseMetadataToJson( + UpdateReleaseMetadata instance) => + { + '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', +}; diff --git a/packages/shorebird_code_push_protocol/pubspec.yaml b/packages/shorebird_code_push_protocol/pubspec.yaml index 421845947..0c56d47a5 100644 --- a/packages/shorebird_code_push_protocol/pubspec.yaml +++ b/packages/shorebird_code_push_protocol/pubspec.yaml @@ -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 diff --git a/packages/shorebird_code_push_protocol/test/src/messages/create_patch/create_patch_request_test.dart b/packages/shorebird_code_push_protocol/test/src/messages/create_patch/create_patch_request_test.dart index b4f12ce68..e2f3ba1c8 100644 --- a/packages/shorebird_code_push_protocol/test/src/messages/create_patch/create_patch_request_test.dart +++ b/packages/shorebird_code_push_protocol/test/src/messages/create_patch/create_patch_request_test.dart @@ -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(), diff --git a/packages/shorebird_code_push_protocol/test/src/messages/update_release/update_release_request_test.dart b/packages/shorebird_code_push_protocol/test/src/messages/update_release/update_release_request_test.dart index 11b210da3..4cdc626bf 100644 --- a/packages/shorebird_code_push_protocol/test/src/messages/update_release/update_release_request_test.dart +++ b/packages/shorebird_code_push_protocol/test/src/messages/update_release/update_release_request_test.dart @@ -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(), diff --git a/packages/shorebird_code_push_protocol/test/src/models/build_environment_metadata_test.dart b/packages/shorebird_code_push_protocol/test/src/models/build_environment_metadata_test.dart new file mode 100644 index 000000000..8133c395c --- /dev/null +++ b/packages/shorebird_code_push_protocol/test/src/models/build_environment_metadata_test.dart @@ -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))); + }); + }); + }); +} diff --git a/packages/shorebird_code_push_protocol/test/src/models/create_patch_metadata_test.dart b/packages/shorebird_code_push_protocol/test/src/models/create_patch_metadata_test.dart new file mode 100644 index 000000000..2732c9b48 --- /dev/null +++ b/packages/shorebird_code_push_protocol/test/src/models/create_patch_metadata_test.dart @@ -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))); + }); + }); + }); +} diff --git a/packages/shorebird_code_push_protocol/test/src/models/update_release_metadata_test.dart b/packages/shorebird_code_push_protocol/test/src/models/update_release_metadata_test.dart new file mode 100644 index 000000000..53fa15b3c --- /dev/null +++ b/packages/shorebird_code_push_protocol/test/src/models/update_release_metadata_test.dart @@ -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))); + }); + }); + }); +}