main
dart 80 lines 2.71 KB
Raw
1 import 'package:flutter/material.dart';
2 import 'package:flutter_riverpod/flutter_riverpod.dart';
3 import 'package:flutter_test/flutter_test.dart';
4 import 'package:localmind/core/models/enums.dart';
5 import 'package:localmind/core/providers/storage_providers.dart';
6 import 'package:localmind/features/chat/data/models/message.dart';
7 import 'package:localmind/features/chat/views/components/chat_bubble/assistant_bubble.dart';
8 import 'package:localmind/l10n/app_localizations.dart';
9 import 'package:shared_preferences/shared_preferences.dart';
10
11 void main() {
12 setUp(() {
13 SharedPreferences.setMockInitialValues({});
14 });
15
16 Widget buildHarness({
17 required SharedPreferences prefs,
18 required Message message,
19 required bool isStreaming,
20 }) {
21 return ProviderScope(
22 overrides: [sharedPreferencesProvider.overrideWithValue(prefs)],
23 child: MaterialApp(
24 localizationsDelegates: AppLocalizations.localizationsDelegates,
25 supportedLocales: AppLocalizations.supportedLocales,
26 home: Scaffold(
27 body: AssistantBubble(message: message, isStreaming: isStreaming),
28 ),
29 ),
30 );
31 }
32
33 testWidgets(
34 'AssistantBubble streaming content disables SelectionArea to prevent concurrent modification crash',
35 (tester) async {
36 final prefs = await SharedPreferences.getInstance();
37 final message = Message(
38 id: 'msg-stream',
39 conversationId: 'conv-1',
40 role: MessageRole.assistant,
41 content: 'Streaming response token by token...',
42 createdAt: DateTime.now(),
43 status: MessageStatus.streaming,
44 );
45
46 await tester.pumpWidget(
47 buildHarness(prefs: prefs, message: message, isStreaming: true),
48 );
49 await tester.pump();
50
51 // When streaming, SelectionArea must not wrap the live-mutating markdown
52 expect(find.byType(SelectionArea), findsNothing);
53 expect(find.text('Streaming response token by token...'), findsOneWidget);
54 },
55 );
56
57 testWidgets(
58 'AssistantBubble completed content enables SelectionArea for copy and selection',
59 (tester) async {
60 final prefs = await SharedPreferences.getInstance();
61 final message = Message(
62 id: 'msg-done',
63 conversationId: 'conv-1',
64 role: MessageRole.assistant,
65 content: 'Final completed response.',
66 createdAt: DateTime.now(),
67 status: MessageStatus.complete,
68 );
69
70 await tester.pumpWidget(
71 buildHarness(prefs: prefs, message: message, isStreaming: false),
72 );
73 await tester.pump();
74
75 // When completed, SelectionArea should wrap the markdown content
76 expect(find.byType(SelectionArea), findsOneWidget);
77 expect(find.text('Final completed response.'), findsOneWidget);
78 },
79 );
80 }