From 45558888069bf85648518c4d87c9396bc8dc8158 Mon Sep 17 00:00:00 2001 From: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Date: Sun, 28 Jun 2026 00:40:58 +0530 Subject: [PATCH] cleanup test --- mobile/test/unit/mocks.dart | 20 ++++++++++- .../actions/edit_action_test.dart | 33 ++++++++----------- .../presentation/presentation_context.dart | 1 + 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/mobile/test/unit/mocks.dart b/mobile/test/unit/mocks.dart index c62170ce7c..304bd3bc8d 100644 --- a/mobile/test/unit/mocks.dart +++ b/mobile/test/unit/mocks.dart @@ -3,6 +3,8 @@ import 'dart:typed_data'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; +import 'package:immich_mobile/domain/models/asset_edit.model.dart'; +import 'package:immich_mobile/domain/models/exif.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/platform/native_sync_api.g.dart'; import 'package:mocktail/mocktail.dart' as mock; @@ -18,7 +20,7 @@ class RepositoryMocks { final localAlbum = LocalAlbumRepositoryStub(MockLocalAlbumRepository()); final localAsset = LocalAssetRepositoryStub(MockDriftLocalAssetRepository()); final trashedAsset = MockTrashedLocalAssetRepository(); - final remoteAsset = MockRemoteAssetRepository(); + final remoteAsset = RemoteAssetRepositoryStub(MockRemoteAssetRepository()); final nativeApi = NativeSyncApiStub(MockNativeSyncApi()); @@ -31,10 +33,12 @@ class RepositoryMocks { localAlbum.reset(); localAsset.reset(); reset(trashedAsset); + remoteAsset.reset(); nativeApi.reset(); _stubLocalAlbumRepository(); _stubLocalAssetRepository(); _stubNativeSyncApi(); + _stubRemoteAssetRepository(); } void _stubLocalAlbumRepository() { @@ -50,6 +54,11 @@ class RepositoryMocks { void _stubNativeSyncApi() { when(nativeApi.hashAssets).thenAnswer((_) async => []); } + + void _stubRemoteAssetRepository() { + when(remoteAsset.getAssetEdits).thenAnswer((_) async => []); + when(remoteAsset.getExif).thenAnswer((_) async => null); + } } class ServiceMocks { @@ -122,6 +131,15 @@ extension type const LocalAssetRepositoryStub(MockDriftLocalAssetRepository repo () => repo.updateHashes(any()); } +extension type const RemoteAssetRepositoryStub(MockRemoteAssetRepository repo) + implements Stub { + Future> Function() get getAssetEdits => + () => repo.getAssetEdits(any()); + + Future Function() get getExif => + () => repo.getExif(any()); +} + extension type const PartnerServiceStub(MockPartnerService service) implements Stub { Stream> Function() get getCandidates => () => service.getCandidates(any()); diff --git a/mobile/test/unit/presentation/actions/edit_action_test.dart b/mobile/test/unit/presentation/actions/edit_action_test.dart index 47d3ec960b..a3368aa454 100644 --- a/mobile/test/unit/presentation/actions/edit_action_test.dart +++ b/mobile/test/unit/presentation/actions/edit_action_test.dart @@ -6,25 +6,29 @@ import 'package:immich_mobile/domain/models/asset_edit.model.dart'; import 'package:immich_mobile/models/server_info/server_version.model.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/presentation/actions/edit.action.dart'; -import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart'; import 'package:immich_ui/immich_ui.dart'; import 'package:mocktail/mocktail.dart'; +import '../../../domain/service.mock.dart'; import '../../../infrastructure/repository.mock.dart'; import '../../factories/remote_asset_factory.dart'; -import '../../presentation_context.dart'; import '../../riverpod_mocks.dart'; +import '../presentation_context.dart'; void main() { late PresentationContext context; + late MockRemoteAssetRepository remoteAssetRepo; + late MockAssetService assetService; const supportedVersion = ServerVersion(major: 2, minor: 6, patch: 0); const unsupportedVersion = ServerVersion(major: 2, minor: 5, patch: 9); setUp(() async { context = await PresentationContext.create(); + remoteAssetRepo = context.repository.remoteAsset.repo; + assetService = context.service.asset.service; }); tearDown(() { @@ -32,7 +36,6 @@ void main() { }); List overrides(ServerVersion version) => [ - ...context.overrides, serverInfoProvider.overrideWith((ref) => FakeServerInfoNotifier(version)), ]; @@ -40,7 +43,7 @@ void main() { RemoteAssetFactory.create(ownerId: context.currentUser.id, type: type); Future pumpAction(WidgetTester tester, EditAssetAction action, {ServerVersion version = supportedVersion}) => - tester.pumpTestWidget(ActionIconButtonWidget(action: action), overrides: overrides(version)); + tester.pumpTestWidget(context, ActionIconButtonWidget(action: action), overrides: overrides(version)); group('EditAssetAction', () { testWidgets('visible for a single owned editable asset on a supported server', (tester) async { @@ -77,18 +80,11 @@ void main() { group('EditAssetAction onAction', () { testWidgets('reads the edits and exif for the asset from the repository', (tester) async { final asset = owned(); - final repository = MockRemoteAssetRepository(); - when(() => repository.getAssetEdits(any())).thenAnswer((_) async => const []); - when(() => repository.getExif(any())).thenAnswer((_) async => null); - - await tester.pumpTestAction( - EditAssetAction(assets: [asset]), - overrides: [...overrides(supportedVersion), remoteAssetRepositoryProvider.overrideWithValue(repository)], - ); + await tester.pumpTestAction(context, EditAssetAction(assets: [asset]), overrides: overrides(supportedVersion)); await tester.pumpAndSettle(); - verify(() => repository.getAssetEdits(asset.id)).called(1); - verify(() => repository.getExif(asset.id)).called(1); + verify(() => remoteAssetRepo.getAssetEdits(asset.id)).called(1); + verify(() => remoteAssetRepo.getExif(asset.id)).called(1); }); testWidgets('applyEdits forwards the edits to the service and waits for both ready events', (tester) async { @@ -97,22 +93,19 @@ void main() { late WidgetRef capturedRef; await tester.pumpTestWidget( + context, Consumer( builder: (_, ref, _) { capturedRef = ref; return const SizedBox.shrink(); }, ), - overrides: [ - ...context.overrides, - assetServiceProvider.overrideWithValue(context.mocks.asset.service), - websocketProvider.overrideWith((ref) => websocket = FakeWebsocketNotifier(ref)), - ], + overrides: [websocketProvider.overrideWith((ref) => websocket = FakeWebsocketNotifier(ref))], ); await EditAssetAction.applyEdits(capturedRef, 'asset-1', edits); - verify(() => context.mocks.asset.service.applyEdits('asset-1', edits)).called(1); + verify(() => assetService.applyEdits('asset-1', edits)).called(1); expect(websocket.waitedEvents, containsAll(['AssetEditReadyV1', 'AssetEditReadyV2'])); }); }); diff --git a/mobile/test/unit/presentation/presentation_context.dart b/mobile/test/unit/presentation/presentation_context.dart index 585cb3707e..37825b0c83 100644 --- a/mobile/test/unit/presentation/presentation_context.dart +++ b/mobile/test/unit/presentation/presentation_context.dart @@ -43,6 +43,7 @@ class PresentationContext { currentUserProvider.overrideWith((ref) => CurrentUserProvider(service.user.service)), assetServiceProvider.overrideWithValue(service.asset.service), partnerServiceProvider.overrideWithValue(service.partner.service), + remoteAssetRepositoryProvider.overrideWithValue(repository.remoteAsset.repo), ]; static Future create() async {