1+ import 'package:flutter/material.dart' ;
2+ import 'package:flutter_test/flutter_test.dart' ;
3+ import 'package:zulip/model/content.dart' ;
4+ import 'package:zulip/widgets/content.dart' ;
5+
6+ import '../example_data.dart' as eg;
7+ import '../model/binding.dart' ;
8+ import '../test_navigation.dart' ;
9+ import 'test_app.dart' ;
10+
11+ Widget plainContent (String html) {
12+ return Builder (builder: (context) =>
13+ DefaultTextStyle (
14+ style: ContentTheme .of (context).textStylePlainParagraph,
15+ child: BlockContentList (nodes: parseContent (html).nodes)));
16+ }
17+
18+ Future <void > prepareContent (WidgetTester tester, Widget child, {
19+ bool wrapWithPerAccountStoreWidget = false ,
20+ }) async {
21+ if (wrapWithPerAccountStoreWidget) {
22+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
23+ }
24+ addTearDown (testBinding.reset);
25+
26+ await tester.pumpWidget (TestZulipApp (
27+ accountId: wrapWithPerAccountStoreWidget ? eg.selfAccount.id : null ,
28+ child: child));
29+ await tester.pump (); // global store
30+ if (wrapWithPerAccountStoreWidget) {
31+ await tester.pump ();
32+ }
33+ }
34+
35+ void main () {
36+ TestZulipBinding .ensureInitialized ();
37+
38+ group ('UserMention tappable functionality' , () {
39+ testWidgets ('mention with valid user ID has gesture detector' , (tester) async {
40+ await prepareContent (tester, plainContent ('<p><span class="user-mention" data-user-id="123">@Test User</span></p>' ));
41+ expect (find.byType (GestureDetector ), findsOneWidget);
42+ });
43+
44+ testWidgets ('mention with user ID navigates to ProfilePage when tapped' , (tester) async {
45+ final pushedRoutes = < Route <dynamic >> [];
46+ final testNavObserver = TestNavigatorObserver ()
47+ ..onPushed = (route, prevRoute) => pushedRoutes.add (route);
48+
49+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
50+ addTearDown (testBinding.reset);
51+ await tester.pumpWidget (TestZulipApp (
52+ accountId: eg.selfAccount.id,
53+ navigatorObservers: [testNavObserver],
54+ child: plainContent ('<p><span class="user-mention" data-user-id="123">@Test User</span></p>' ),
55+ ));
56+ await tester.pump (); // global store
57+
58+ await tester.pump (); // Allow any deferred work to complete
59+
60+ expect (find.byType (GestureDetector ), findsOneWidget);
61+
62+ await tester.tap (find.byType (GestureDetector ));
63+ await tester.pump ();
64+
65+ // Verify that navigation occurred (at least one route was pushed)
66+ expect (pushedRoutes.length, greaterThanOrEqualTo (1 ));
67+ });
68+
69+ testWidgets ('mention without user ID does not have gesture detector' , (tester) async {
70+ await prepareContent (tester, plainContent ('<p><span class="user-mention">@Test User</span></p>' ));
71+ expect (find.byType (GestureDetector ), findsNothing);
72+ });
73+
74+ testWidgets ('mention with invalid user ID does not have gesture detector' , (tester) async {
75+ await prepareContent (tester, plainContent ('<p><span class="user-mention" data-user-id="invalid">@Test User</span></p>' ));
76+ expect (find.byType (GestureDetector ), findsNothing);
77+ });
78+
79+ testWidgets ('mention with wildcard user ID does not have gesture detector' , (tester) async {
80+ await prepareContent (tester, plainContent ('<p><span class="user-mention" data-user-id="*">@all</span></p>' ));
81+ expect (find.byType (GestureDetector ), findsNothing);
82+ });
83+
84+ testWidgets ('mention with zero user ID does not have gesture detector' , (tester) async {
85+ await prepareContent (tester, plainContent ('<p><span class="user-mention" data-user-id="0">@Test User</span></p>' ));
86+ expect (find.byType (GestureDetector ), findsNothing);
87+ });
88+
89+ testWidgets ('mention with negative user ID does not have gesture detector' , (tester) async {
90+ await prepareContent (tester, plainContent ('<p><span class="user-mention" data-user-id="-1">@Test User</span></p>' ));
91+ expect (find.byType (GestureDetector ), findsNothing);
92+ });
93+ });
94+ }
0 commit comments