@@ -1653,6 +1653,78 @@ void main() {
16531653
16541654 debugNetworkImageHttpClientProvider = null ;
16551655 });
1656+
1657+ group ('Opens conversation on tap?' , () {
1658+ // (copied from test/widgets/content_test.dart)
1659+ Future <void > tapText (WidgetTester tester, Finder textFinder) async {
1660+ final height = tester.getSize (textFinder).height;
1661+ final target = tester.getTopLeft (textFinder)
1662+ .translate (height/ 4 , height/ 2 ); // aim for middle of first letter
1663+ await tester.tapAt (target);
1664+ }
1665+
1666+ final subscription = eg.subscription (eg.stream (streamId: eg.defaultStreamMessageStreamId));
1667+ final topic = 'some topic' ;
1668+
1669+ void doTest (Narrow narrow, bool expected, {required Message Function () mkMessage}) {
1670+ testWidgets ('${expected ? 'yes' : 'no' }, if in $narrow ' , (tester) async {
1671+ final message = mkMessage ();
1672+
1673+ Route <dynamic >? lastPushedRoute;
1674+ final navObserver = TestNavigatorObserver ()
1675+ ..onPushed = ((route, prevRoute) => lastPushedRoute = route);
1676+
1677+ await setupMessageListPage (
1678+ tester,
1679+ narrow: narrow,
1680+ messages: [message],
1681+ subscriptions: [subscription],
1682+ navObservers: [navObserver]
1683+ );
1684+ lastPushedRoute = null ;
1685+
1686+ // Tapping interactive content still works.
1687+ await store.handleEvent (eg.updateMessageEditEvent (message,
1688+ renderedContent: '<p><a href="https://example/">link</a></p>' ));
1689+ await tester.pump ();
1690+ await tapText (tester, find.text ('link' ));
1691+ await tester.pump (Duration .zero);
1692+ check (lastPushedRoute).isNull ();
1693+ final launchUrlCalls = testBinding.takeLaunchUrlCalls ();
1694+ check (launchUrlCalls.single.url).equals (Uri .parse ('https://example/' ));
1695+
1696+ // Tapping non-interactive content opens the conversation (if expected).
1697+ await store.handleEvent (eg.updateMessageEditEvent (message,
1698+ renderedContent: '<p>plain content</p>' ));
1699+ await tester.pump ();
1700+ await tapText (tester, find.text ('plain content' ));
1701+ if (expected) {
1702+ final expectedNarrow = SendableNarrow .ofMessage (message, selfUserId: store.selfUserId);
1703+
1704+ check (lastPushedRoute).isNotNull ().isA <MaterialAccountWidgetRoute >()
1705+ .page.isA <MessageListPage >()
1706+ ..initNarrow.equals (expectedNarrow)
1707+ ..initAnchorMessageId.equals (message.id);
1708+ } else {
1709+ check (lastPushedRoute).isNull ();
1710+ }
1711+
1712+ // TODO test tapping whitespace in message
1713+ });
1714+ }
1715+
1716+ doTest (CombinedFeedNarrow (), false , mkMessage: () => eg.streamMessage ());
1717+ doTest (ChannelNarrow (subscription.streamId), false ,
1718+ mkMessage: () => eg.streamMessage (stream: subscription));
1719+ doTest (TopicNarrow (subscription.streamId, eg.t (topic)), false ,
1720+ mkMessage: () => eg.streamMessage (stream: subscription));
1721+ doTest (DmNarrow .withUsers ([], selfUserId: eg.selfUser.userId), false ,
1722+ mkMessage: () => eg.streamMessage (stream: subscription, topic: topic));
1723+ doTest (StarredMessagesNarrow (), true ,
1724+ mkMessage: () => eg.streamMessage (flags: [MessageFlag .starred]));
1725+ doTest (MentionsNarrow (), true ,
1726+ mkMessage: () => eg.streamMessage (flags: [MessageFlag .mentioned]));
1727+ });
16561728 });
16571729
16581730 group ('OutboxMessageWithPossibleSender' , () {
0 commit comments