1+ import 'dart:async' ;
2+
13import 'package:flutter/material.dart' ;
24import 'package:flutter_localizations/flutter_localizations.dart' ;
35import 'package:flutter_test/flutter_test.dart' ;
46import 'package:provider/provider.dart' ;
57import 'package:shared_preferences/shared_preferences.dart' ;
68
79import 'package:omi/backend/preferences.dart' ;
10+ import 'package:omi/backend/http/api/audio.dart' ;
811import 'package:omi/l10n/app_localizations.dart' ;
912import 'package:omi/pages/conversations/private_cloud_sync_page.dart' ;
1013import 'package:omi/providers/user_provider.dart' ;
@@ -29,7 +32,13 @@ void main() {
2932 await SharedPreferencesUtil .init ();
3033 });
3134
32- Future <void > _pumpPage (WidgetTester tester, UserProvider userProvider) async {
35+ Future <void > _pumpPage (
36+ WidgetTester tester,
37+ UserProvider userProvider, {
38+ Future <List <CloudAudioConversation >> Function ()? loadCloudAudioConversations,
39+ Future <bool > Function ()? deleteAllCloudAudioOverride,
40+ Future <bool ?> Function (BuildContext context)? confirmDeleteOverride,
41+ }) async {
3342 await tester.pumpWidget (
3443 ChangeNotifierProvider <UserProvider >.value (
3544 value: userProvider,
@@ -41,7 +50,11 @@ void main() {
4150 GlobalCupertinoLocalizations .delegate,
4251 ],
4352 supportedLocales: AppLocalizations .supportedLocales,
44- home: const PrivateCloudSyncPage (),
53+ home: PrivateCloudSyncPage (
54+ loadCloudAudioConversations: loadCloudAudioConversations ?? getCloudAudioConversations,
55+ deleteAllCloudAudio: deleteAllCloudAudioOverride ?? deleteAllCloudAudio,
56+ confirmDeleteOverride: confirmDeleteOverride,
57+ ),
4558 ),
4659 ),
4760 );
@@ -60,4 +73,39 @@ void main() {
6073 expect (find.text (l10n.deleteAllAudio), findsOneWidget);
6174 expect (find.text (l10n.noCloudAudioFiles), findsOneWidget);
6275 });
76+
77+ testWidgets ('ignores stale cloud-audio fetches after delete all succeeds' , (tester) async {
78+ final userProvider = _StubUserProvider (enabled: true );
79+ final loadCompleter = Completer <List <CloudAudioConversation >>();
80+ addTearDown (userProvider.dispose);
81+
82+ await _pumpPage (
83+ tester,
84+ userProvider,
85+ loadCloudAudioConversations: () => loadCompleter.future,
86+ deleteAllCloudAudioOverride: () async => true ,
87+ confirmDeleteOverride: (_) async => true ,
88+ );
89+
90+ final context = tester.element (find.byType (PrivateCloudSyncPage ));
91+ final l10n = AppLocalizations .of (context);
92+
93+ await tester.tap (find.text (l10n.deleteAllAudio));
94+ await tester.pump ();
95+ await tester.pump ();
96+
97+ loadCompleter.complete ([
98+ CloudAudioConversation (
99+ id: 'conv-1' ,
100+ title: 'Phantom conversation' ,
101+ audioFileCount: 1 ,
102+ totalDuration: 42 ,
103+ ),
104+ ]);
105+ await tester.pump ();
106+ await tester.pump ();
107+
108+ expect (find.text ('Phantom conversation' ), findsNothing);
109+ expect (find.text (l10n.noCloudAudioFiles), findsOneWidget);
110+ });
63111}
0 commit comments