diff --git a/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart b/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart index 13d79b6f..63964bb3 100644 --- a/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart +++ b/packages/shorebird_cli/test/src/code_push_client_wrapper_test.dart @@ -79,13 +79,15 @@ void main() { const flutterRevision = '123'; const displayName = 'TestApp'; const releaseVersion = '1.0.0'; - const release = Release( + final release = Release( id: 1, appId: appId, version: releaseVersion, flutterRevision: flutterRevision, displayName: displayName, platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); final partchArtifactBundle = PatchArtifactBundle( arch: arch.name, @@ -435,7 +437,7 @@ void main() { expect( () => runWithOverrides( () => codePushClientWrapper.ensureReleaseIsNotActive( - release: const Release( + release: Release( id: releaseId, appId: appId, version: releaseVersion, @@ -444,6 +446,8 @@ void main() { platformStatuses: { releasePlatform: ReleaseStatus.active, }, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), platform: releasePlatform, ), @@ -467,13 +471,15 @@ Please bump your version number and try again.''', await expectLater( runWithOverrides( () async => codePushClientWrapper.ensureReleaseIsNotActive( - release: const Release( + release: Release( id: releaseId, appId: appId, version: releaseVersion, flutterRevision: flutterRevision, displayName: displayName, platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), platform: releasePlatform, ), @@ -489,13 +495,15 @@ Please bump your version number and try again.''', await expectLater( runWithOverrides( () async => codePushClientWrapper.ensureReleaseIsNotActive( - release: const Release( + release: Release( id: releaseId, appId: appId, version: releaseVersion, flutterRevision: flutterRevision, displayName: displayName, platformStatuses: {releasePlatform: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), platform: releasePlatform, ), diff --git a/packages/shorebird_cli/test/src/commands/patch/patch_aar_command_test.dart b/packages/shorebird_cli/test/src/commands/patch/patch_aar_command_test.dart index 5258c5bc..1fd7bad7 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patch_aar_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patch_aar_command_test.dart @@ -66,13 +66,15 @@ void main() { size: 42, url: 'https://example.com/release.aar', ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); late AndroidArchiveDiffer archiveDiffer; @@ -436,7 +438,7 @@ ${release.version}'''), when( () => codePushClientWrapper.getReleases(appId: any(named: 'appId')), ).thenAnswer( - (_) async => const [ + (_) async => [ Release( id: 0, appId: appId, @@ -444,6 +446,8 @@ ${release.version}'''), flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.android: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ], ); @@ -466,7 +470,7 @@ Please re-run the release command for this version or create a new release.'''), when( () => codePushClientWrapper.getReleases(appId: any(named: 'appId')), ).thenAnswer( - (_) async => const [ + (_) async => [ Release( id: 0, appId: appId, @@ -474,6 +478,8 @@ Please re-run the release command for this version or create a new release.'''), flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.ios: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ], ); diff --git a/packages/shorebird_cli/test/src/commands/patch/patch_android_command_test.dart b/packages/shorebird_cli/test/src/commands/patch/patch_android_command_test.dart index 60e03caa..f702009d 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patch_android_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patch_android_command_test.dart @@ -68,13 +68,15 @@ void main() { size: 42, url: 'https://example.com/release.aab', ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); const pubspecYamlContent = ''' name: example @@ -417,13 +419,15 @@ flutter: releaseVersion: any(named: 'releaseVersion'), ), ).thenAnswer( - (_) async => const Release( + (_) async => Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {releasePlatform: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ); final tempDir = setUpTempDir(); @@ -447,7 +451,7 @@ Please re-run the release command for this version or create a new release.'''), appId: any(named: 'appId'), ), ).thenAnswer( - (_) async => const [ + (_) async => [ Release( id: 0, appId: appId, @@ -455,6 +459,8 @@ Please re-run the release command for this version or create a new release.'''), flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.ios: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ], ); diff --git a/packages/shorebird_cli/test/src/commands/patch/patch_ios_command_test.dart b/packages/shorebird_cli/test/src/commands/patch/patch_ios_command_test.dart index 9a5bd9fc..0c300cfa 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patch_ios_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patch_ios_command_test.dart @@ -105,13 +105,15 @@ flutter: size: 42, url: 'https://example.com/release.ipa', ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.ios: ReleaseStatus.active}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); group(PatchIosCommand, () { @@ -517,13 +519,15 @@ error: exportArchive: No signing certificate "iOS Distribution" found releaseVersion: any(named: 'releaseVersion'), ), ).thenAnswer( - (_) async => const Release( + (_) async => Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.android: ReleaseStatus.active}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ); final tempDir = setUpTempDir(); @@ -545,13 +549,15 @@ error: exportArchive: No signing certificate "iOS Distribution" found releaseVersion: any(named: 'releaseVersion'), ), ).thenAnswer( - (_) async => const Release( + (_) async => Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.ios: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ); final tempDir = setUpTempDir(); @@ -576,7 +582,7 @@ Please re-run the release command for this version or create a new release.'''), releaseVersion: any(named: 'releaseVersion'), ), ).thenAnswer( - (_) async => const Release( + (_) async => Release( id: 0, appId: appId, version: version, @@ -586,6 +592,8 @@ Please re-run the release command for this version or create a new release.'''), ReleasePlatform.android: ReleaseStatus.draft, ReleasePlatform.ios: ReleaseStatus.active, }, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ); final tempDir = setUpTempDir(); diff --git a/packages/shorebird_cli/test/src/commands/patch/patch_ios_framework_command_test.dart b/packages/shorebird_cli/test/src/commands/patch/patch_ios_framework_command_test.dart index af78073d..2ad75db2 100644 --- a/packages/shorebird_cli/test/src/commands/patch/patch_ios_framework_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/patch/patch_ios_framework_command_test.dart @@ -60,13 +60,15 @@ flutter: size: 42, url: 'https://example.com/release.xcframework', ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); late ArgResults argResults; @@ -400,7 +402,7 @@ ${release.version}'''), when( () => codePushClientWrapper.getReleases(appId: any(named: 'appId')), ).thenAnswer( - (_) async => const [ + (_) async => [ Release( id: 0, appId: appId, @@ -408,6 +410,8 @@ ${release.version}'''), flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.ios: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ], ); @@ -430,7 +434,7 @@ Please re-run the release command for this version or create a new release.'''), when( () => codePushClientWrapper.getReleases(appId: any(named: 'appId')), ).thenAnswer( - (_) async => const [ + (_) async => [ Release( id: 0, appId: appId, @@ -438,6 +442,8 @@ Please re-run the release command for this version or create a new release.'''), flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {ReleasePlatform.android: ReleaseStatus.draft}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ], ); diff --git a/packages/shorebird_cli/test/src/commands/release/release_aar_command_test.dart b/packages/shorebird_cli/test/src/commands/release/release_aar_command_test.dart index 20103911..fb5161d4 100644 --- a/packages/shorebird_cli/test/src/commands/release/release_aar_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/release_aar_command_test.dart @@ -40,13 +40,15 @@ void main() { const versionName = '1.2.3'; const versionCode = '1'; const version = '$versionName+$versionCode'; - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); const releasePlatform = ReleasePlatform.android; const buildNumber = '1.0'; diff --git a/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart b/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart index 43ec7637..f0a2e6d2 100644 --- a/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/release_android_command_test.dart @@ -44,13 +44,15 @@ void main() { createdAt: DateTime(2023), updatedAt: DateTime(2023), ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); const javaHome = 'test-java-home'; diff --git a/packages/shorebird_cli/test/src/commands/release/release_ios_command_test.dart b/packages/shorebird_cli/test/src/commands/release/release_ios_command_test.dart index e5bd0df8..c9fc99d7 100644 --- a/packages/shorebird_cli/test/src/commands/release/release_ios_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/release_ios_command_test.dart @@ -42,13 +42,15 @@ void main() { createdAt: DateTime(2023), updatedAt: DateTime(2023), ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); const infoPlistContent = ''' diff --git a/packages/shorebird_cli/test/src/commands/release/release_ios_framework_command_test.dart b/packages/shorebird_cli/test/src/commands/release/release_ios_framework_command_test.dart index 2a179d77..65aac569 100644 --- a/packages/shorebird_cli/test/src/commands/release/release_ios_framework_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/release/release_ios_framework_command_test.dart @@ -39,13 +39,15 @@ void main() { createdAt: DateTime(2023), updatedAt: DateTime(2023), ); - const release = Release( + final release = Release( id: 0, appId: appId, version: version, flutterRevision: flutterRevision, displayName: '1.2.3+1', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); const pubspecYamlContent = ''' name: example 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 95a2b9a4..2c5dedfe 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 @@ -464,10 +464,10 @@ class CodePushClient { throw _parseErrorResponse(response.statusCode, response.body); } - final releases = json.decode(response.body) as List; - return releases - .map((release) => Release.fromJson(release as Map)) - .toList(); + final decoded = GetReleasesResponse.fromJson( + json.decode(response.body) as Map, + ); + return decoded.releases; } /// Get all release artifacts for a specific [releaseId] diff --git a/packages/shorebird_code_push_client/test/src/code_push_client_test.dart b/packages/shorebird_code_push_client/test/src/code_push_client_test.dart index f8c08ec6..c514ee35 100644 --- a/packages/shorebird_code_push_client/test/src/code_push_client_test.dart +++ b/packages/shorebird_code_push_client/test/src/code_push_client_test.dart @@ -1125,6 +1125,8 @@ void main() { flutterRevision: flutterRevision, displayName: displayName, platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ), ), @@ -1871,13 +1873,15 @@ void main() { test('completes when request succeeds (empty)', () async { when(() => httpClient.send(any())).thenAnswer( (_) async => http.StreamedResponse( - Stream.value(utf8.encode(json.encode([]))), + Stream.value( + utf8.encode(json.encode(GetReleasesResponse(releases: []))), + ), HttpStatus.ok, ), ); - final apps = await codePushClient.getReleases(appId: appId); - expect(apps, isEmpty); + final releases = await codePushClient.getReleases(appId: appId); + expect(releases, isEmpty); }); test('completes when request succeeds (populated)', () async { @@ -1889,6 +1893,8 @@ void main() { flutterRevision: flutterRevision, displayName: 'v1.0.0', platformStatuses: {ReleasePlatform.android: ReleaseStatus.draft}, + createdAt: DateTime(2022), + updatedAt: DateTime(2023), ), Release( id: 1, @@ -1897,12 +1903,16 @@ void main() { flutterRevision: flutterRevision, displayName: 'v1.0.1', platformStatuses: {}, + createdAt: DateTime(2022), + updatedAt: DateTime(2023), ), ]; when(() => httpClient.send(any())).thenAnswer( (_) async => http.StreamedResponse( - Stream.value(utf8.encode(json.encode(expected))), + Stream.value( + utf8.encode(json.encode(GetReleasesResponse(releases: expected))), + ), HttpStatus.ok, ), ); diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases.dart b/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases.dart new file mode 100644 index 00000000..f954ff8a --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases.dart @@ -0,0 +1 @@ +export 'get_releases_response.dart'; diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases_response.dart b/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases_response.dart new file mode 100644 index 00000000..58f028c3 --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases_response.dart @@ -0,0 +1,23 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart'; + +part 'get_releases_response.g.dart'; + +/// {@template get_releases_response} +/// The response body for GET /api/v1/apps/:id/releases +/// {@endtemplate} +@JsonSerializable() +class GetReleasesResponse { + /// {@macro get_releases_response} + const GetReleasesResponse({required this.releases}); + + /// Converts a Map to a [GetReleasesResponse]. + factory GetReleasesResponse.fromJson(Map json) => + _$GetReleasesResponseFromJson(json); + + /// Converts a [GetReleasesResponse] to a Map. + Json toJson() => _$GetReleasesResponseToJson(this); + + /// The list of releases for the app. + final List releases; +} diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases_response.g.dart b/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases_response.g.dart new file mode 100644 index 00000000..2b10b396 --- /dev/null +++ b/packages/shorebird_code_push_protocol/lib/src/messages/get_releases/get_releases_response.g.dart @@ -0,0 +1,31 @@ +// 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 'get_releases_response.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GetReleasesResponse _$GetReleasesResponseFromJson(Map json) => + $checkedCreate( + 'GetReleasesResponse', + json, + ($checkedConvert) { + final val = GetReleasesResponse( + releases: $checkedConvert( + 'releases', + (v) => (v as List) + .map((e) => Release.fromJson(e as Map)) + .toList()), + ); + return val; + }, + ); + +Map _$GetReleasesResponseToJson( + GetReleasesResponse instance) => + { + 'releases': instance.releases.map((e) => e.toJson()).toList(), + }; diff --git a/packages/shorebird_code_push_protocol/lib/src/messages/messages.dart b/packages/shorebird_code_push_protocol/lib/src/messages/messages.dart index 0dcf5fc8..53f1af2c 100644 --- a/packages/shorebird_code_push_protocol/lib/src/messages/messages.dart +++ b/packages/shorebird_code_push_protocol/lib/src/messages/messages.dart @@ -14,6 +14,7 @@ export 'get_apps/get_apps.dart'; export 'get_overages/get_overages.dart'; export 'get_release_artifacts/get_release_artifacts.dart'; export 'get_release_patches/get_release_patches.dart'; +export 'get_releases/get_releases.dart'; export 'get_usage/get_usage.dart'; export 'promote_patch/promote_patch.dart'; export 'update_overages/update_overages.dart'; diff --git a/packages/shorebird_code_push_protocol/lib/src/models/release.dart b/packages/shorebird_code_push_protocol/lib/src/models/release.dart index 47f732b2..20c681e8 100644 --- a/packages/shorebird_code_push_protocol/lib/src/models/release.dart +++ b/packages/shorebird_code_push_protocol/lib/src/models/release.dart @@ -17,6 +17,8 @@ class Release { required this.flutterRevision, required this.displayName, required this.platformStatuses, + required this.createdAt, + required this.updatedAt, }); /// Converts a Map to a [Release] @@ -43,4 +45,10 @@ class Release { /// The status of the release for each platform. final Map platformStatuses; + + /// The date and time the release was created. + final DateTime createdAt; + + /// The date and time the release was last updated. + final DateTime updatedAt; } diff --git a/packages/shorebird_code_push_protocol/lib/src/models/release.g.dart b/packages/shorebird_code_push_protocol/lib/src/models/release.g.dart index 20bebf46..11e6c22c 100644 --- a/packages/shorebird_code_push_protocol/lib/src/models/release.g.dart +++ b/packages/shorebird_code_push_protocol/lib/src/models/release.g.dart @@ -25,6 +25,10 @@ Release _$ReleaseFromJson(Map json) => $checkedCreate( (k, e) => MapEntry($enumDecode(_$ReleasePlatformEnumMap, k), $enumDecode(_$ReleaseStatusEnumMap, e)), )), + createdAt: + $checkedConvert('created_at', (v) => DateTime.parse(v as String)), + updatedAt: + $checkedConvert('updated_at', (v) => DateTime.parse(v as String)), ); return val; }, @@ -32,7 +36,9 @@ Release _$ReleaseFromJson(Map json) => $checkedCreate( 'appId': 'app_id', 'flutterRevision': 'flutter_revision', 'displayName': 'display_name', - 'platformStatuses': 'platform_statuses' + 'platformStatuses': 'platform_statuses', + 'createdAt': 'created_at', + 'updatedAt': 'updated_at' }, ); @@ -44,6 +50,8 @@ Map _$ReleaseToJson(Release instance) => { 'display_name': instance.displayName, 'platform_statuses': instance.platformStatuses.map((k, e) => MapEntry(_$ReleasePlatformEnumMap[k]!, _$ReleaseStatusEnumMap[e]!)), + 'created_at': instance.createdAt.toIso8601String(), + 'updated_at': instance.updatedAt.toIso8601String(), }; const _$ReleaseStatusEnumMap = { diff --git a/packages/shorebird_code_push_protocol/test/src/messages/create_release/create_release_response_test.dart b/packages/shorebird_code_push_protocol/test/src/messages/create_release/create_release_response_test.dart index 81f9213b..4c78e87c 100644 --- a/packages/shorebird_code_push_protocol/test/src/messages/create_release/create_release_response_test.dart +++ b/packages/shorebird_code_push_protocol/test/src/messages/create_release/create_release_response_test.dart @@ -4,7 +4,7 @@ import 'package:test/test.dart'; void main() { group(CreateReleaseResponse, () { test('can be (de)serialized', () { - const response = CreateReleaseResponse( + final response = CreateReleaseResponse( release: Release( id: 0, appId: 'test-app-id', @@ -12,6 +12,8 @@ void main() { displayName: 'v1.0.0', flutterRevision: 'flutter-revision', platformStatuses: {}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ), ); expect( diff --git a/packages/shorebird_code_push_protocol/test/src/messages/get_releases/get_releases_response_test.dart b/packages/shorebird_code_push_protocol/test/src/messages/get_releases/get_releases_response_test.dart new file mode 100644 index 00000000..78883d91 --- /dev/null +++ b/packages/shorebird_code_push_protocol/test/src/messages/get_releases/get_releases_response_test.dart @@ -0,0 +1,30 @@ +import 'package:shorebird_code_push_protocol/shorebird_code_push_protocol.dart'; +import 'package:test/test.dart'; + +void main() { + group(GetReleasesResponse, () { + test('can be (de)serialized', () { + final response = GetReleasesResponse( + releases: [ + Release( + id: 0, + displayName: 'v1.0.0', + appId: 'test-app-id', + flutterRevision: 'flutter-revision', + version: '1.0.0', + platformStatuses: { + ReleasePlatform.ios: ReleaseStatus.draft, + ReleasePlatform.android: ReleaseStatus.active, + }, + createdAt: DateTime(2022), + updatedAt: DateTime(2023), + ) + ], + ); + expect( + GetReleasesResponse.fromJson(response.toJson()).toJson(), + equals(response.toJson()), + ); + }); + }); +} diff --git a/packages/shorebird_code_push_protocol/test/src/models/release_test.dart b/packages/shorebird_code_push_protocol/test/src/models/release_test.dart index c799c864..0dbfa26a 100644 --- a/packages/shorebird_code_push_protocol/test/src/models/release_test.dart +++ b/packages/shorebird_code_push_protocol/test/src/models/release_test.dart @@ -4,13 +4,15 @@ import 'package:test/test.dart'; void main() { group(Release, () { test('can be (de)serialized', () { - const release = Release( + final release = Release( id: 1, appId: 'app-id', version: '1.0.0', flutterRevision: '83305b5088e6fe327fb3334a73ff190828d85713', displayName: 'v1.0.0', platformStatuses: {ReleasePlatform.android: ReleaseStatus.active}, + createdAt: DateTime(2023), + updatedAt: DateTime(2023), ); expect( Release.fromJson(release.toJson()).toJson(),