@@ -13,6 +13,7 @@ const fetchPersistedGameSummaryMock = vi.fn();
1313const fetchPersistedReplayMock = vi . fn ( ) ;
1414const openPersistedGameSocketMock = vi . fn ( ) ;
1515const fetchPublicPlayersMock = vi . fn ( ) ;
16+ const readPrefetchedPublicPlayersMock = vi . fn ( ) ;
1617const createHumanInvitationMock = vi . fn ( ) ;
1718const fetchInvitationGameMock = vi . fn ( ) ;
1819const rejectInvitationMock = vi . fn ( ) ;
@@ -47,7 +48,8 @@ vi.mock("@/features/match/persistence", () => ({
4748} ) ) ;
4849
4950vi . mock ( "@/features/identity/api" , ( ) => ( {
50- fetchPublicPlayers : ( ...args : unknown [ ] ) => fetchPublicPlayersMock ( ...args ) ,
51+ prefetchPublicPlayers : ( ...args : unknown [ ] ) => fetchPublicPlayersMock ( ...args ) ,
52+ readPrefetchedPublicPlayers : ( ...args : unknown [ ] ) => readPrefetchedPublicPlayersMock ( ...args ) ,
5153} ) ) ;
5254
5355vi . mock ( "@/features/matches/api" , ( ) => ( {
@@ -89,6 +91,7 @@ describe("MatchPage spectator mode", () => {
8991 fetchPersistedReplayMock . mockReset ( ) ;
9092 openPersistedGameSocketMock . mockReset ( ) ;
9193 fetchPublicPlayersMock . mockReset ( ) ;
94+ readPrefetchedPublicPlayersMock . mockReset ( ) ;
9295 createHumanInvitationMock . mockReset ( ) ;
9396 fetchInvitationGameMock . mockReset ( ) ;
9497 rejectInvitationMock . mockReset ( ) ;
@@ -152,6 +155,7 @@ describe("MatchPage spectator mode", () => {
152155 enabled : true ,
153156 } ,
154157 ] ) ;
158+ readPrefetchedPublicPlayersMock . mockReturnValue ( null ) ;
155159 useAuthMock . mockReturnValue ( {
156160 user : { id : "spectator" , username : "spec" } ,
157161 loading : false ,
@@ -207,6 +211,33 @@ describe("MatchPage spectator mode", () => {
207211 expect ( screen . getByLabelText ( "Jugador P1" ) ) . toBeDisabled ( ) ;
208212 expect ( screen . getByLabelText ( "Jugador P2" ) ) . toBeDisabled ( ) ;
209213 } , 15000 ) ;
214+
215+ it ( "uses prefetched player catalog immediately before refreshing in background" , async ( ) => {
216+ const cachedPlayers = [
217+ {
218+ user_id : "bot-cached" ,
219+ is_bot : true ,
220+ username : "CachedBot" ,
221+ bot_kind : "heuristic" ,
222+ agent_type : "heuristic" ,
223+ heuristic_level : "normal" ,
224+ model_mode : null ,
225+ enabled : true ,
226+ } ,
227+ ] ;
228+ readPrefetchedPublicPlayersMock . mockReturnValueOnce ( cachedPlayers ) ;
229+ fetchPublicPlayersMock . mockResolvedValueOnce ( cachedPlayers ) ;
230+
231+ render ( < MatchPage /> ) ;
232+
233+ await waitFor ( ( ) => {
234+ expect ( screen . getByLabelText ( "Rival (jugador)" ) ) . toHaveValue ( "bot-cached" ) ;
235+ } ) ;
236+ expect ( fetchPublicPlayersMock ) . toHaveBeenCalledWith ( "token-spec" , {
237+ limit : 200 ,
238+ maxAgeMs : 0 ,
239+ } ) ;
240+ } ) ;
210241} ) ;
211242
212243describe ( "MatchPage automatic persistence" , ( ) => {
@@ -220,6 +251,7 @@ describe("MatchPage automatic persistence", () => {
220251 fetchPersistedReplayMock . mockReset ( ) ;
221252 openPersistedGameSocketMock . mockReset ( ) ;
222253 fetchPublicPlayersMock . mockReset ( ) ;
254+ readPrefetchedPublicPlayersMock . mockReset ( ) ;
223255 createHumanInvitationMock . mockReset ( ) ;
224256 fetchInvitationGameMock . mockReset ( ) ;
225257 rejectInvitationMock . mockReset ( ) ;
@@ -283,6 +315,7 @@ describe("MatchPage automatic persistence", () => {
283315 enabled : true ,
284316 } ,
285317 ] ) ;
318+ readPrefetchedPublicPlayersMock . mockReturnValue ( null ) ;
286319 useAuthMock . mockReturnValue ( {
287320 user : { id : "u1" , username : "demo" } ,
288321 loading : false ,
@@ -420,6 +453,7 @@ describe("MatchPage queued human vs human", () => {
420453 fetchPersistedReplayMock . mockReset ( ) ;
421454 openPersistedGameSocketMock . mockReset ( ) ;
422455 fetchPublicPlayersMock . mockReset ( ) ;
456+ readPrefetchedPublicPlayersMock . mockReset ( ) ;
423457 createHumanInvitationMock . mockReset ( ) ;
424458 fetchInvitationGameMock . mockReset ( ) ;
425459 rejectInvitationMock . mockReset ( ) ;
@@ -483,6 +517,7 @@ describe("MatchPage queued human vs human", () => {
483517 enabled : true ,
484518 } ,
485519 ] ) ;
520+ readPrefetchedPublicPlayersMock . mockReturnValue ( null ) ;
486521 useAuthMock . mockReturnValue ( {
487522 user : { id : "u2" , username : "bravo" } ,
488523 loading : false ,
0 commit comments