@@ -1653,6 +1653,82 @@ 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, {
1670+ required bool expected,
1671+ required Message Function () mkMessage,
1672+ }) {
1673+ testWidgets ('${expected ? 'yes' : 'no' }, if in $narrow ' , (tester) async {
1674+ final message = mkMessage ();
1675+
1676+ Route <dynamic >? lastPushedRoute;
1677+ final navObserver = TestNavigatorObserver ()
1678+ ..onPushed = ((route, prevRoute) => lastPushedRoute = route);
1679+
1680+ await setupMessageListPage (
1681+ tester,
1682+ narrow: narrow,
1683+ messages: [message],
1684+ subscriptions: [subscription],
1685+ navObservers: [navObserver]
1686+ );
1687+ lastPushedRoute = null ;
1688+
1689+ // Tapping interactive content still works.
1690+ await store.handleEvent (eg.updateMessageEditEvent (message,
1691+ renderedContent: '<p><a href="https://example/">link</a></p>' ));
1692+ await tester.pump ();
1693+ await tapText (tester, find.text ('link' ));
1694+ await tester.pump (Duration .zero);
1695+ check (lastPushedRoute).isNull ();
1696+ final launchUrlCalls = testBinding.takeLaunchUrlCalls ();
1697+ check (launchUrlCalls.single.url).equals (Uri .parse ('https://example/' ));
1698+
1699+ // Tapping non-interactive content opens the conversation (if expected).
1700+ await store.handleEvent (eg.updateMessageEditEvent (message,
1701+ renderedContent: '<p>plain content</p>' ));
1702+ await tester.pump ();
1703+ await tapText (tester, find.text ('plain content' ));
1704+ if (expected) {
1705+ final expectedNarrow = SendableNarrow .ofMessage (message, selfUserId: store.selfUserId);
1706+
1707+ check (lastPushedRoute).isNotNull ().isA <MaterialAccountWidgetRoute >()
1708+ .page.isA <MessageListPage >()
1709+ ..initNarrow.equals (expectedNarrow)
1710+ ..initAnchorMessageId.equals (message.id);
1711+ } else {
1712+ check (lastPushedRoute).isNull ();
1713+ }
1714+
1715+ // TODO test tapping whitespace in message
1716+ });
1717+ }
1718+
1719+ doTest (expected: false , CombinedFeedNarrow (),
1720+ mkMessage: () => eg.streamMessage ());
1721+ doTest (expected: false , ChannelNarrow (subscription.streamId),
1722+ mkMessage: () => eg.streamMessage (stream: subscription));
1723+ doTest (expected: false , TopicNarrow (subscription.streamId, eg.t (topic)),
1724+ mkMessage: () => eg.streamMessage (stream: subscription));
1725+ doTest (expected: false , DmNarrow .withUsers ([], selfUserId: eg.selfUser.userId),
1726+ mkMessage: () => eg.streamMessage (stream: subscription, topic: topic));
1727+ doTest (expected: true , StarredMessagesNarrow (),
1728+ mkMessage: () => eg.streamMessage (flags: [MessageFlag .starred]));
1729+ doTest (expected: true , MentionsNarrow (),
1730+ mkMessage: () => eg.streamMessage (flags: [MessageFlag .mentioned]));
1731+ });
16561732 });
16571733
16581734 group ('OutboxMessageWithPossibleSender' , () {
0 commit comments