diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 96d9562502..1b0c9cf3d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,11 @@ jobs: TZ=UTC git --git-dir ~/flutter/.git log -1 --format='%h | %ci | %s' --date=iso8601-local echo ~/flutter/bin >> "$GITHUB_PATH" + # The Flutter tool assumes the tip of tree is "upstream/master": + # https://github.com/flutter/flutter/issues/160558 + # TODO(upstream): make workaround unneeded + git --git-dir ~/flutter/.git update-ref refs/remotes/upstream/master origin/main + - name: Download Flutter SDK artifacts (flutter precache) run: flutter precache --universal diff --git a/lib/widgets/home.dart b/lib/widgets/home.dart index fcd7a41b98..45c5ea43c1 100644 --- a/lib/widgets/home.dart +++ b/lib/widgets/home.dart @@ -101,10 +101,15 @@ class _HomePageState extends State { // TODO(a11y): add tooltips for these buttons final navigationBarButtons = [ button(_HomePageTab.inbox, ZulipIcons.inbox), + _NavigationBarButton( icon: ZulipIcons.message_feed, + selected: false, + onPressed: () => Navigator.push(context, + MessageListPage.buildRoute(context: context, + narrow: const CombinedFeedNarrow()))), button(_HomePageTab.channels, ZulipIcons.hash_italic), // TODO(#1094): Users button(_HomePageTab.directMessages, ZulipIcons.user), - _NavigationBarButton( icon: ZulipIcons.menu, + _NavigationBarButton( icon: ZulipIcons.menu, selected: false, onPressed: () => _showMainMenu(context, tabNotifier: _tab)), ]; diff --git a/test/widgets/home_test.dart b/test/widgets/home_test.dart index 1cfdc52944..27b3cac8e0 100644 --- a/test/widgets/home_test.dart +++ b/test/widgets/home_test.dart @@ -3,12 +3,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_checks/flutter_checks.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:zulip/api/model/events.dart'; +import 'package:zulip/model/narrow.dart'; import 'package:zulip/model/store.dart'; import 'package:zulip/widgets/app.dart'; import 'package:zulip/widgets/app_bar.dart'; import 'package:zulip/widgets/home.dart'; import 'package:zulip/widgets/icons.dart'; import 'package:zulip/widgets/inbox.dart'; +import 'package:zulip/widgets/message_list.dart'; import 'package:zulip/widgets/page.dart'; import 'package:zulip/widgets/profile.dart'; import 'package:zulip/widgets/subscription_list.dart'; @@ -19,6 +21,8 @@ import '../example_data.dart' as eg; import '../flutter_checks.dart'; import '../model/binding.dart'; import '../model/test_store.dart'; +import '../test_navigation.dart'; +import 'message_list_checks.dart'; import 'page_checks.dart'; import 'test_app.dart'; @@ -26,19 +30,20 @@ void main () { TestZulipBinding.ensureInitialized(); late PerAccountStore store; + late FakeApiConnection connection; - Future prepare(WidgetTester tester) async { + Future prepare(WidgetTester tester, { + NavigatorObserver? navigatorObserver, + }) async { addTearDown(testBinding.reset); await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot()); store = await testBinding.globalStore.perAccount(eg.selfAccount.id); - - await store.addUsers([eg.selfUser, eg.otherUser]); - final stream = eg.stream(); - await store.addStream(stream); - await store.addSubscription(eg.subscription(stream)); + connection = store.connection as FakeApiConnection; + await store.addUser(eg.selfUser); await tester.pumpWidget(TestZulipApp( accountId: eg.selfAccount.id, + navigatorObservers: navigatorObserver != null ? [navigatorObserver] : [], child: const HomePage())); await tester.pump(); } @@ -46,6 +51,7 @@ void main () { group('bottom nav navigation', () { testWidgets('preserve states when switching between views', (tester) async { await prepare(tester); + await store.addUser(eg.otherUser); await store.handleEvent(MessageEvent( id: 0, message: eg.dmMessage(from: eg.otherUser, to: [eg.selfUser]))); await tester.pump(); @@ -91,6 +97,23 @@ void main () { of: find.byType(ZulipAppBar), matching: find.text('Direct messages'))).findsOne(); }); + + testWidgets('combined feed', (tester) async { + final pushedRoutes = >[]; + final testNavObserver = TestNavigatorObserver() + ..onPushed = (route, prevRoute) => pushedRoutes.add(route); + await prepare(tester, navigatorObserver: testNavObserver); + pushedRoutes.clear(); + + connection.prepare(json: eg.newestGetMessagesResult( + foundOldest: true, messages: []).toJson()); + await tester.tap(find.byIcon(ZulipIcons.message_feed)); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 250)); + check(pushedRoutes).single.isA().page + .isA() + .initNarrow.equals(const CombinedFeedNarrow()); + }); }); group('menu', () {