@@ -4,6 +4,7 @@ import 'package:cambridge_beer_festival/screens/screens.dart';
44import 'package:cambridge_beer_festival/models/models.dart' ;
55import 'package:cambridge_beer_festival/providers/providers.dart' ;
66import 'package:cambridge_beer_festival/services/services.dart' ;
7+ import 'package:go_router/go_router.dart' ;
78import 'package:provider/provider.dart' ;
89import 'package:mockito/mockito.dart' ;
910import 'package:shared_preferences/shared_preferences.dart' ;
@@ -86,6 +87,30 @@ void main() {
8687 );
8788 }
8889
90+ Widget createTestWidgetWithRouter (String drinkId) {
91+ final router = GoRouter (
92+ initialLocation: '/cbf2025/drink/beer/$drinkId ' ,
93+ routes: [
94+ GoRoute (
95+ path: '/cbf2025/drink/:category/:drinkId' ,
96+ builder: (context, state) => ChangeNotifierProvider <BeerProvider >.value (
97+ value: provider,
98+ child: DrinkDetailScreen (festivalId: 'cbf2025' , drinkId: state.pathParameters['drinkId' ]! ),
99+ ),
100+ ),
101+ GoRoute (
102+ path: '/cbf2025/brewery/:breweryId' ,
103+ builder: (context, state) => const Scaffold (body: Text ('Brewery Screen' )),
104+ ),
105+ GoRoute (
106+ path: '/cbf2025/style/:style' ,
107+ builder: (context, state) => const Scaffold (body: Text ('Style Screen' )),
108+ ),
109+ ],
110+ );
111+ return MaterialApp .router (routerConfig: router);
112+ }
113+
89114 testWidgets ('displays drink not found when drink does not exist' ,
90115 (WidgetTester tester) async {
91116 await tester.pumpWidget (createTestWidget ('nonexistent' ));
@@ -296,23 +321,39 @@ void main() {
296321 .thenAnswer ((_) async => [drink]);
297322 await provider.loadDrinks ();
298323
299- await tester.pumpWidget (createTestWidget ('drink1' ));
324+ await tester.pumpWidget (createTestWidgetWithRouter ('drink1' ));
300325 await tester.pumpAndSettle ();
301326
302- // Find brewery card and ensure it's visible
303327 final breweryCard = find.ancestor (
304328 of: find.text ('Test Brewery' ),
305329 matching: find.byType (Card ),
306330 );
307331 await tester.ensureVisible (breweryCard.last);
308332 await tester.pumpAndSettle ();
309-
310- // Verify the brewery card is present and tappable
311- expect (breweryCard, findsWidgets);
312-
313- // NOTE: Navigation to BreweryScreen uses go_router's context.push()
314- // which requires GoRouter in the widget tree. This is tested in E2E tests
315- // (test-e2e/routing.spec.ts) instead of unit tests.
333+
334+ await tester.tap (breweryCard.last);
335+ await tester.pumpAndSettle ();
336+
337+ expect (find.text ('Brewery Screen' ), findsOneWidget);
338+ });
339+
340+ testWidgets ('navigates to style screen when style chip is tapped' ,
341+ (WidgetTester tester) async {
342+ when (mockDrinkRepository.getDrinks (any))
343+ .thenAnswer ((_) async => [drink]);
344+ await provider.loadDrinks ();
345+
346+ await tester.pumpWidget (createTestWidgetWithRouter ('drink1' ));
347+ await tester.pumpAndSettle ();
348+
349+ final styleChip = find.text ('IPA' );
350+ await tester.ensureVisible (styleChip);
351+ await tester.pumpAndSettle ();
352+
353+ await tester.tap (styleChip);
354+ await tester.pumpAndSettle ();
355+
356+ expect (find.text ('Style Screen' ), findsOneWidget);
316357 });
317358
318359 testWidgets ('does not display description section when notes are null' ,
0 commit comments