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