diff --git a/lib/game/view/widgets/game_over_dialog.dart b/lib/game/view/widgets/game_over_dialog.dart index b80f668c..06135fbb 100644 --- a/lib/game/view/widgets/game_over_dialog.dart +++ b/lib/game/view/widgets/game_over_dialog.dart @@ -30,7 +30,7 @@ class GameOverDialog extends StatelessWidget { Text(l10n.gameOver), TextButton( onPressed: () => Navigator.of(context).push( - LeaderBoardPage.route(theme), + LeaderBoardPage.route(theme: theme), ), child: Text(l10n.leadersBoard), ), diff --git a/lib/leaderboard/view/leader_board_page.dart b/lib/leaderboard/view/leader_board_page.dart index 46170860..245d7425 100644 --- a/lib/leaderboard/view/leader_board_page.dart +++ b/lib/leaderboard/view/leader_board_page.dart @@ -11,7 +11,7 @@ class LeaderBoardPage extends StatelessWidget { final PinballTheme theme; - static Route route(PinballTheme theme) { + static Route route({required PinballTheme theme}) { return MaterialPageRoute( builder: (_) => LeaderBoardPage(theme: theme), ); @@ -36,24 +36,26 @@ class LeaderBoardView extends StatelessWidget { return Scaffold( body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const SizedBox(height: 80), - Text( - l10n.leadersBoard, - style: Theme.of(context).textTheme.headline3, - ), - const SizedBox(height: 80), - const _LeaderBoardView(), - const SizedBox(height: 20), - TextButton( - onPressed: () => Navigator.of(context).push( - CharacterSelectionPage.route(), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 80), + Text( + l10n.leadersBoard, + style: Theme.of(context).textTheme.headline3, ), - child: Text(l10n.retry), - ), - ], + const SizedBox(height: 80), + const _LeaderBoardView(), + const SizedBox(height: 20), + TextButton( + onPressed: () => Navigator.of(context).push( + CharacterSelectionPage.route(), + ), + child: Text(l10n.retry), + ), + ], + ), ), ), ); @@ -67,14 +69,12 @@ class _LeaderBoardView extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(20), - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - _LeaderBoardHeaders(), - _LeaderBoardList(), - ], - ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + _LeaderBoardHeaders(), + _LeaderBoardList(), + ], ), ); } diff --git a/test/game/view/pinball_game_page_test.dart b/test/game/view/pinball_game_page_test.dart index dcf0c001..b5dc0d07 100644 --- a/test/game/view/pinball_game_page_test.dart +++ b/test/game/view/pinball_game_page_test.dart @@ -103,10 +103,7 @@ void main() { ); await tester.pump(); - expect( - find.text('Game Over'), - findsOneWidget, - ); + expect(find.byType(GameOverDialog), findsOneWidget); }, ); diff --git a/test/game/view/widgets/game_over_dialog_test.dart b/test/game/view/widgets/game_over_dialog_test.dart new file mode 100644 index 00000000..fee147dd --- /dev/null +++ b/test/game/view/widgets/game_over_dialog_test.dart @@ -0,0 +1,48 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockingjay/mockingjay.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +import '../../../helpers/helpers.dart'; + +void main() { + group('GameOverDialog', () { + testWidgets('renders correctly', (tester) async { + final l10n = await AppLocalizations.delegate.load(Locale('en')); + await tester.pumpApp( + const GameOverDialog( + theme: PinballTheme( + characterTheme: DashTheme(), + ), + ), + ); + + expect(find.text(l10n.gameOver), findsOneWidget); + expect(find.text(l10n.leadersBoard), findsOneWidget); + }); + + testWidgets('tapping on leaderboard button navigates to LeaderBoardPage', + (tester) async { + final l10n = await AppLocalizations.delegate.load(Locale('en')); + final navigator = MockNavigator(); + when(() => navigator.push(any())).thenAnswer((_) async {}); + + await tester.pumpApp( + const GameOverDialog( + theme: PinballTheme( + characterTheme: DashTheme(), + ), + ), + navigator: navigator, + ); + + await tester.tap(find.widgetWithText(TextButton, l10n.leadersBoard)); + + verify(() => navigator.push(any())).called(1); + }); + }); +} diff --git a/test/leaderboard/view/leader_board_page_test.dart b/test/leaderboard/view/leader_board_page_test.dart new file mode 100644 index 00000000..93df325a --- /dev/null +++ b/test/leaderboard/view/leader_board_page_test.dart @@ -0,0 +1,90 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockingjay/mockingjay.dart'; +import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball/leaderboard/view/leader_board_page.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + group('LeaderBoardPage', () { + testWidgets('renders LeaderBoardView', (tester) async { + final l10n = await AppLocalizations.delegate.load(Locale('en')); + await tester.pumpApp( + LeaderBoardPage( + theme: PinballTheme( + characterTheme: DashTheme(), + ), + ), + ); + + expect(find.byType(LeaderBoardView), findsOneWidget); + }); + + testWidgets('route returns a valid navigation route', (tester) async { + await tester.pumpApp( + Scaffold( + body: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + Navigator.of(context).push( + LeaderBoardPage.route( + theme: PinballTheme( + characterTheme: DashTheme(), + ), + ), + ); + }, + child: const Text('Tap me'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Tap me')); + await tester.pumpAndSettle(); + + expect(find.byType(LeaderBoardPage), findsOneWidget); + }); + }); + + group('LeaderBoardView', () { + testWidgets('renders correctly', (tester) async { + final l10n = await AppLocalizations.delegate.load(Locale('en')); + await tester.pumpApp( + LeaderBoardPage( + theme: PinballTheme( + characterTheme: DashTheme(), + ), + ), + ); + + expect(find.text(l10n.leadersBoard), findsOneWidget); + expect(find.text(l10n.retry), findsOneWidget); + }); + + testWidgets('navigates to CharacterSelectionPage when retry is tapped', + (tester) async { + final navigator = MockNavigator(); + when(() => navigator.push(any())).thenAnswer((_) async {}); + + await tester.pumpApp( + LeaderBoardPage( + theme: PinballTheme( + characterTheme: DashTheme(), + ), + ), + navigator: navigator, + ); + await tester.ensureVisible(find.byType(TextButton)); + await tester.tap(find.byType(TextButton)); + + verify(() => navigator.push(any())).called(1); + }); + }); +}