@@ -173,4 +173,94 @@ void main() {
173173 );
174174 expect (UnsavedWorkRegistry .instance.hasUnsaved, isFalse);
175175 });
176+
177+ testWidgets (
178+ 'dirty Refresh Cancel keeps edits; Discard reloads from server' ,
179+ (tester) async {
180+ await tester.binding.setSurfaceSize (const material.Size (800 , 700 ));
181+
182+ await tester.pumpWidget (
183+ queryaThemeTestShell (
184+ child: material.SizedBox (
185+ width: 800 ,
186+ height: 700 ,
187+ child: MongoDocumentEditor (
188+ connection: connection,
189+ database: 'db' ,
190+ collection: 'items' ,
191+ document: const {'_id' : 'abc' , 'a' : 1 },
192+ refreshToken: 0 ,
193+ ),
194+ ),
195+ ),
196+ );
197+ await tester.pumpAndSettle ();
198+ await pumpSyntaxHighlightDebounce (tester);
199+
200+ await tester.enterText (
201+ find.byType (material.EditableText ),
202+ '{"_id":"abc","a":999}' ,
203+ );
204+ await tester.pump ();
205+ expect (UnsavedWorkRegistry .instance.hasUnsaved, isTrue);
206+
207+ // Bump refreshToken (simulate breadcrumb toolbar Refresh)
208+ await tester.pumpWidget (
209+ queryaThemeTestShell (
210+ child: material.SizedBox (
211+ width: 800 ,
212+ height: 700 ,
213+ child: MongoDocumentEditor (
214+ connection: connection,
215+ database: 'db' ,
216+ collection: 'items' ,
217+ document: const {'_id' : 'abc' , 'a' : 1 },
218+ refreshToken: 1 ,
219+ ),
220+ ),
221+ ),
222+ );
223+ await tester.pumpAndSettle ();
224+
225+ // Dialog must appear
226+ expect (find.text ('Unsaved changes' ), findsOneWidget);
227+
228+ // Cancel must keep edits
229+ await tester.tap (find.text ('Cancel' ));
230+ await tester.pumpAndSettle ();
231+
232+ final editable = tester.widget< material.EditableText > (
233+ find.byType (material.EditableText ),
234+ );
235+ expect (editable.controller.text, contains ('999' ));
236+ expect (UnsavedWorkRegistry .instance.hasUnsaved, isTrue);
237+
238+ // Bump refreshToken again
239+ await tester.pumpWidget (
240+ queryaThemeTestShell (
241+ child: material.SizedBox (
242+ width: 800 ,
243+ height: 700 ,
244+ child: MongoDocumentEditor (
245+ connection: connection,
246+ database: 'db' ,
247+ collection: 'items' ,
248+ document: const {'_id' : 'abc' , 'a' : 1 },
249+ refreshToken: 2 ,
250+ ),
251+ ),
252+ ),
253+ );
254+ await tester.pumpAndSettle ();
255+
256+ expect (find.text ('Unsaved changes' ), findsOneWidget);
257+ await tester.tap (find.text ('Discard' ));
258+ await tester.pumpAndSettle ();
259+
260+ expect (UnsavedWorkRegistry .instance.hasUnsaved, isFalse);
261+
262+ await tester.pumpWidget (
263+ queryaThemeTestShell (child: const material.SizedBox ()),
264+ );
265+ });
176266}
0 commit comments