@@ -1470,4 +1470,112 @@ void main() {
1470
1470
..status.equals (AnimationStatus .dismissed);
1471
1471
});
1472
1472
});
1473
+
1474
+ group ('recipient header navigation in multi-channel narrows' , () {
1475
+ late List <Route <void >> pushedRoutes;
1476
+ late TestNavigatorObserver navObserver;
1477
+ late ZulipStream channel;
1478
+ late StreamMessage message;
1479
+ late Finder recipientHeaderFinder;
1480
+ late Rect recipientHeaderRect;
1481
+
1482
+ Future <void > prepare (WidgetTester tester, {String ? topic}) async {
1483
+ pushedRoutes = < Route <void >> [];
1484
+ navObserver = TestNavigatorObserver ()
1485
+ ..onPushed = (route, prevRoute) => pushedRoutes.add (route);
1486
+ channel = eg.stream ();
1487
+ message = topic == null
1488
+ ? eg.streamMessage (stream: channel)
1489
+ : eg.streamMessage (stream: channel, topic: topic);
1490
+
1491
+ await setupMessageListPage (tester,
1492
+ narrow: const CombinedFeedNarrow (),
1493
+ streams: [channel],
1494
+ subscriptions: [eg.subscription (channel)],
1495
+ messages: [message],
1496
+ navObservers: [navObserver]);
1497
+
1498
+ assert (pushedRoutes.length == 1 );
1499
+ pushedRoutes.clear ();
1500
+
1501
+ recipientHeaderFinder = find.byType (StreamMessageRecipientHeader );
1502
+ recipientHeaderRect = tester.getRect (recipientHeaderFinder);
1503
+ }
1504
+
1505
+ testWidgets ("navigates to ChannelNarrow when tapping above or below channel name in recipient header" ,
1506
+ (tester) async {
1507
+ await prepare (tester);
1508
+
1509
+ final channelNameFinder = find.descendant (
1510
+ of: recipientHeaderFinder,
1511
+ matching: find.text (channel.name));
1512
+ final channelNameRect = tester.getRect (channelNameFinder);
1513
+
1514
+ connection.prepare (json: eg.newestGetMessagesResult (
1515
+ foundOldest: true , messages: [message]).toJson ());
1516
+ // First tap: 1 px below the top of recepient header
1517
+ // at channelName x coordinate
1518
+ await tester.tapAt (Offset (
1519
+ channelNameRect.center.dx, recipientHeaderRect.top + 1 ));
1520
+
1521
+ await tester.pump ();
1522
+ check (pushedRoutes).single.isA <WidgetRoute >().page.isA <MessageListPage >()
1523
+ .initNarrow.equals (ChannelNarrow (channel.streamId));
1524
+ await tester.pumpAndSettle ();
1525
+
1526
+ // Navigate back to original page and clear routes
1527
+ await tester.pageBack ();
1528
+ await tester.pumpAndSettle ();
1529
+ pushedRoutes.clear ();
1530
+
1531
+ connection.prepare (json: eg.newestGetMessagesResult (
1532
+ foundOldest: true , messages: [message]).toJson ());
1533
+ // Second tap: 1 px above the bottom of the recipient header
1534
+ // at channelName x coordinate
1535
+ await tester.tapAt (Offset (
1536
+ channelNameRect.center.dx, channelNameRect.bottom - 1 ));
1537
+ await tester.pump ();
1538
+ check (pushedRoutes).single.isA <WidgetRoute >().page.isA <MessageListPage >()
1539
+ .initNarrow.equals (ChannelNarrow (channel.streamId));
1540
+ await tester.pumpAndSettle ();
1541
+ });
1542
+
1543
+ testWidgets ("navigates to TopicNarrow when tapping above or below topic name in recipient header" ,
1544
+ (tester) async {
1545
+ const testTopic = 'testTopic' ;
1546
+ await prepare (tester, topic: testTopic);
1547
+
1548
+ final topicNameFinder = find.descendant (
1549
+ of: recipientHeaderFinder,
1550
+ matching: find.text (testTopic));
1551
+ final topicNameRect = tester.getRect (topicNameFinder);
1552
+
1553
+ connection.prepare (json: eg.newestGetMessagesResult (
1554
+ foundOldest: true , messages: [message]).toJson ());
1555
+ // First tap: 1 px below the top of recepient header
1556
+ // at topicName x coordinate
1557
+ await tester.tapAt (Offset (
1558
+ topicNameRect.center.dx, recipientHeaderRect.top + 1 ));
1559
+ await tester.pump ();
1560
+ check (pushedRoutes).single.isA <WidgetRoute >().page.isA <MessageListPage >()
1561
+ .initNarrow.equals (TopicNarrow (channel.streamId, message.topic));
1562
+ await tester.pumpAndSettle ();
1563
+
1564
+ // Navigate back to original page and clear routes
1565
+ await tester.pageBack ();
1566
+ await tester.pumpAndSettle ();
1567
+ pushedRoutes.clear ();
1568
+
1569
+ connection.prepare (json: eg.newestGetMessagesResult (
1570
+ foundOldest: true , messages: [message]).toJson ());
1571
+ // Second tap: 1 px above the bottom of the recipient header
1572
+ // at topicName x coordinate
1573
+ await tester.tapAt (Offset (
1574
+ topicNameRect.center.dx, recipientHeaderRect.bottom - 1 ));
1575
+ await tester.pump ();
1576
+ check (pushedRoutes).single.isA <WidgetRoute >().page.isA <MessageListPage >()
1577
+ .initNarrow.equals (TopicNarrow (channel.streamId, message.topic));
1578
+ await tester.pumpAndSettle ();
1579
+ });
1580
+ });
1473
1581
}
0 commit comments