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