diff --git a/lib/game/components/backbox/backbox.dart b/lib/game/components/backbox/backbox.dart index 8590db44..69f68a58 100644 --- a/lib/game/components/backbox/backbox.dart +++ b/lib/game/components/backbox/backbox.dart @@ -18,7 +18,11 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef { /// {@macro backbox} Backbox({ required LeaderboardRepository leaderboardRepository, - }) : _bloc = BackboxBloc(leaderboardRepository: leaderboardRepository), + required List? entries, + }) : _bloc = BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: entries, + ), _platformHelper = PlatformHelper(); /// {@macro backbox} @@ -40,8 +44,6 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef { anchor = Anchor.bottomCenter; zIndex = ZIndexes.backbox; - _bloc.add(LeaderboardRequested()); - await add(_BackboxSpriteComponent()); await add(_display = Component()); _build(_bloc.state); diff --git a/lib/game/components/backbox/bloc/backbox_bloc.dart b/lib/game/components/backbox/bloc/backbox_bloc.dart index b3952a0c..7afd34de 100644 --- a/lib/game/components/backbox/bloc/backbox_bloc.dart +++ b/lib/game/components/backbox/bloc/backbox_bloc.dart @@ -14,8 +14,13 @@ class BackboxBloc extends Bloc { /// {@macro backbox_bloc} BackboxBloc({ required LeaderboardRepository leaderboardRepository, + required List? initialEntries, }) : _leaderboardRepository = leaderboardRepository, - super(LoadingState()) { + super( + initialEntries != null + ? LeaderboardSuccessState(entries: initialEntries) + : LeaderboardFailureState(), + ) { on(_onPlayerInitialsRequested); on(_onPlayerInitialsSubmitted); on(_onLeaderboardRequested); diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 09d8da23..5e89b0cb 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -55,6 +55,18 @@ class PinballGame extends PinballForge2DGame final GameBloc _gameBloc; + List? _entries; + + Future preFetchLeaderboard() async { + try { + _entries = await leaderboardRepository.fetchTop10Leaderboard(); + } catch (_) { + // An initial null leaderboard means that we couldn't fetch + // the entries for the [Backbox] and it will show the relevant display. + _entries = null; + } + } + @override Future onLoad() async { await add( @@ -91,7 +103,10 @@ class PinballGame extends PinballForge2DGame children: [ BoardBackgroundSpriteComponent(), Boundaries(), - Backbox(leaderboardRepository: leaderboardRepository), + Backbox( + leaderboardRepository: leaderboardRepository, + entries: _entries, + ), GoogleWord(position: Vector2(-4.45, 1.8)), Multipliers(), Multiballs(), diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index 7e2ec85f..bb190668 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -50,6 +50,7 @@ class PinballGamePage extends StatelessWidget { ); final loadables = [ + game.preFetchLeaderboard(), ...game.preLoadAssets(), ...player.load(), ...BonusAnimation.loadAssets(), diff --git a/test/game/components/backbox/backbox_test.dart b/test/game/components/backbox/backbox_test.dart index 40aaa77d..24cb4fb2 100644 --- a/test/game/components/backbox/backbox_test.dart +++ b/test/game/components/backbox/backbox_test.dart @@ -133,19 +133,6 @@ void main() { }, ); - flameTester.test( - 'adds LeaderboardRequested when loaded', - (game) async { - final backbox = Backbox.test( - bloc: bloc, - platformHelper: platformHelper, - ); - await game.pump(backbox); - - verify(() => bloc.add(LeaderboardRequested())).called(1); - }, - ); - flameTester.testGameWidget( 'renders correctly', setUp: (game, tester) async { @@ -175,6 +162,7 @@ void main() { final backbox = Backbox.test( bloc: BackboxBloc( leaderboardRepository: _MockLeaderboardRepository(), + initialEntries: [LeaderboardEntryData.empty], ), platformHelper: platformHelper, ); diff --git a/test/game/components/backbox/bloc/backbox_bloc_test.dart b/test/game/components/backbox/bloc/backbox_bloc_test.dart index 3958adb5..0f265875 100644 --- a/test/game/components/backbox/bloc/backbox_bloc_test.dart +++ b/test/game/components/backbox/bloc/backbox_bloc_test.dart @@ -12,14 +12,37 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { void main() { late LeaderboardRepository leaderboardRepository; + const emptyEntries = []; + const filledEntries = [LeaderboardEntryData.empty]; group('BackboxBloc', () { + test('inits state with LeaderboardSuccessState when has entries', () { + leaderboardRepository = _MockLeaderboardRepository(); + final bloc = BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: filledEntries, + ); + expect(bloc.state, isA()); + }); + + test('inits state with LeaderboardFailureState when has no entries', () { + leaderboardRepository = _MockLeaderboardRepository(); + final bloc = BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: null, + ); + expect(bloc.state, isA()); + }); + blocTest( 'adds InitialsFormState on PlayerInitialsRequested', setUp: () { leaderboardRepository = _MockLeaderboardRepository(); }, - build: () => BackboxBloc(leaderboardRepository: leaderboardRepository), + build: () => BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: emptyEntries, + ), act: (bloc) => bloc.add( PlayerInitialsRequested( score: 100, @@ -46,7 +69,10 @@ void main() { ), ).thenAnswer((_) async {}); }, - build: () => BackboxBloc(leaderboardRepository: leaderboardRepository), + build: () => BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: emptyEntries, + ), act: (bloc) => bloc.add( PlayerInitialsSubmitted( score: 10, @@ -74,7 +100,10 @@ void main() { ), ).thenThrow(Exception('Error')); }, - build: () => BackboxBloc(leaderboardRepository: leaderboardRepository), + build: () => BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: emptyEntries, + ), act: (bloc) => bloc.add( PlayerInitialsSubmitted( score: 10, @@ -100,7 +129,10 @@ void main() { (_) async => [LeaderboardEntryData.empty], ); }, - build: () => BackboxBloc(leaderboardRepository: leaderboardRepository), + build: () => BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: emptyEntries, + ), act: (bloc) => bloc.add(LeaderboardRequested()), expect: () => [ LoadingState(), @@ -116,7 +148,10 @@ void main() { () => leaderboardRepository.fetchTop10Leaderboard(), ).thenThrow(Exception('Error')); }, - build: () => BackboxBloc(leaderboardRepository: leaderboardRepository), + build: () => BackboxBloc( + leaderboardRepository: leaderboardRepository, + initialEntries: emptyEntries, + ), act: (bloc) => bloc.add(LeaderboardRequested()), expect: () => [ LoadingState(), diff --git a/test/game/components/game_bloc_status_listener_test.dart b/test/game/components/game_bloc_status_listener_test.dart index 36e496f3..e8685c3e 100644 --- a/test/game/components/game_bloc_status_listener_test.dart +++ b/test/game/components/game_bloc_status_listener_test.dart @@ -150,7 +150,10 @@ void main() { (game) async { final component = GameBlocStatusListener(); final repository = _MockLeaderboardRepository(); - final backbox = Backbox(leaderboardRepository: repository); + final backbox = Backbox( + leaderboardRepository: repository, + entries: const [], + ); await game.pump([component, backbox]); @@ -163,7 +166,10 @@ void main() { (game) async { final component = GameBlocStatusListener(); final repository = _MockLeaderboardRepository(); - final backbox = Backbox(leaderboardRepository: repository); + final backbox = Backbox( + leaderboardRepository: repository, + entries: const [], + ); final flipper = Flipper.test(side: BoardSide.left); final behavior = FlipperKeyControllingBehavior(); @@ -188,7 +194,10 @@ void main() { final player = _MockPinballPlayer(); final component = GameBlocStatusListener(); final repository = _MockLeaderboardRepository(); - final backbox = Backbox(leaderboardRepository: repository); + final backbox = Backbox( + leaderboardRepository: repository, + entries: const [], + ); await game.pump([component, backbox], pinballPlayer: player); component.onNewState(state); @@ -226,7 +235,10 @@ void main() { (game) async { final component = GameBlocStatusListener(); final repository = _MockLeaderboardRepository(); - final backbox = Backbox(leaderboardRepository: repository); + final backbox = Backbox( + leaderboardRepository: repository, + entries: const [], + ); final flipper = Flipper.test(side: BoardSide.left); await game.pump([component, backbox, flipper]); diff --git a/test/game/view/pinball_game_page_test.dart b/test/game/view/pinball_game_page_test.dart index b9114244..fbcf8c76 100644 --- a/test/game/view/pinball_game_page_test.dart +++ b/test/game/view/pinball_game_page_test.dart @@ -32,7 +32,10 @@ class _TestPinballGame extends PinballGame { @override Future onLoad() async { images.prefix = ''; - final futures = preLoadAssets(); + final futures = [ + ...preLoadAssets(), + preFetchLeaderboard(), + ]; await Future.wait(futures); return super.onLoad();