@@ -218,6 +218,31 @@ public async Task GetPlayerById_NotFound()
218218 output . Should ( ) . BeNull ( ) ;
219219 }
220220
221+ [ Fact ]
222+ public async Task GetPlayerById_WithMultiplePlayers_CachesUnderCorrectSlot ( )
223+ {
224+ await _cacheManager . FlushAll ( ) ;
225+
226+ var accountId = Guid . NewGuid ( ) ;
227+
228+ const uint FirstId = 100u , SecondId = 200u , ThirdId = 300u ;
229+ await _dbPlayerRepository . CreateAsync ( new PlayerData { Id = FirstId , AccountId = accountId , Name = "PlayerA" } ) ;
230+ await _dbPlayerRepository . CreateAsync ( new PlayerData { Id = SecondId , AccountId = accountId , Name = "PlayerB" } ) ;
231+ await _dbPlayerRepository . CreateAsync ( new PlayerData { Id = ThirdId , AccountId = accountId , Name = "PlayerC" } ) ;
232+
233+ var fetched = await _playerManager . GetPlayer ( SecondId ) ;
234+
235+ fetched . Should ( ) . NotBeNull ( ) ;
236+ fetched . Id . Should ( ) . Be ( SecondId ) ;
237+
238+ var keys = await _cacheManager . Server . Keys ( "*" ) ;
239+ keys . Should ( ) . HaveCount ( 2 )
240+ . And . Contain ( $ "player:{ SecondId } ")
241+ . And . Contain ( $ "players:{ accountId } :1") ;
242+ keys . Should ( ) . NotContain ( $ "players:{ accountId } :0") ;
243+ keys . Should ( ) . NotContain ( $ "players:{ accountId } :2") ;
244+ }
245+
221246 [ Fact ]
222247 public async Task GetPlayerByAccountIdAndSlot_NotFound ( )
223248 {
@@ -237,4 +262,45 @@ public async Task DeleteCharacter()
237262 ( await _cacheManager . Server . Keys ( "*" ) ) . Should ( ) . BeEquivalentTo ( [ $ "temp:empire-selection:{ accountId } "] ) ;
238263 ( await _dbPlayerRepository . GetPlayersAsync ( accountId ) ) . Should ( ) . BeEmpty ( ) ;
239264 }
265+
266+ [ Theory ]
267+ [ InlineData ( 0 ) ]
268+ [ InlineData ( 1 ) ]
269+ [ InlineData ( 2 ) ]
270+ [ InlineData ( 3 ) ]
271+ [ InlineData ( 4 ) ]
272+ public async Task GetPlayers_ReturnsOrderedAndCachesWithSlots ( int charactersCount )
273+ {
274+ await _cacheManager . FlushAll ( ) ;
275+ await _db . Players . ExecuteDeleteAsync ( ) ;
276+
277+ var accountId = Guid . NewGuid ( ) ;
278+ var basePlayerId = 1000u ;
279+
280+ for ( uint i = 0 ; i < charactersCount ; i ++ )
281+ {
282+ var id = basePlayerId + i ;
283+ await _dbPlayerRepository . CreateAsync ( new PlayerData { Id = id , AccountId = accountId , Name = $ "Player{ i } " } ) ;
284+ }
285+
286+ var players = await _playerManager . GetPlayers ( accountId ) ;
287+
288+ players . Should ( ) . HaveCount ( charactersCount ) ;
289+ for ( var i = 0 ; i < charactersCount ; i ++ )
290+ {
291+ players [ i ] . Slot . Should ( ) . Be ( ( byte ) i ) ;
292+
293+ var expectedId = basePlayerId + ( uint ) i ;
294+ players [ i ] . Id . Should ( ) . Be ( expectedId ) ;
295+ }
296+
297+ var keys = await _cacheManager . Server . Keys ( "*" ) ;
298+ keys . Should ( ) . HaveCount ( charactersCount * 2 ) ;
299+ for ( var i = 0 ; i < charactersCount ; i ++ )
300+ {
301+ var expectedId = basePlayerId + i ;
302+ keys . Should ( ) . Contain ( $ "player:{ expectedId } ") ;
303+ keys . Should ( ) . Contain ( $ "players:{ accountId } :{ i } ") ;
304+ }
305+ }
240306}
0 commit comments