cleanup test

This commit is contained in:
shenlong-tanwen
2026-06-28 00:40:58 +05:30
parent d490c68a9d
commit 4555888806
3 changed files with 33 additions and 21 deletions
+19 -1
View File
@@ -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<MockRemoteAssetRepository> {
Future<List<AssetEdit>> Function() get getAssetEdits =>
() => repo.getAssetEdits(any());
Future<ExifInfo?> Function() get getExif =>
() => repo.getExif(any());
}
extension type const PartnerServiceStub(MockPartnerService service) implements Stub<MockPartnerService> {
Stream<Iterable<User>> Function() get getCandidates =>
() => service.getCandidates(any());
@@ -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<Override> 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<void> 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 <AssetEdit>[]);
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']));
});
});
@@ -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<PresentationContext> create() async {