@@ -460,6 +460,44 @@ mod tests {
460460 assert ! ( result. is_err( ) ) ;
461461 }
462462
463+ #[ tokio:: test]
464+ async fn get_by_slot_fallback_to_head ( ) {
465+ // Create two validator pubkeys
466+ let pubkeys = vec ! [ test_pubkey( 0 ) , test_pubkey( 1 ) ] ;
467+
468+ // Set up mock server: slot requests fail, but head succeeds
469+ let mock_server = MockServer :: start ( ) . await ;
470+
471+ post_state_validators_not_found ( "1" )
472+ . mount ( & mock_server)
473+ . await ;
474+
475+ post_state_validators_success (
476+ "head" ,
477+ vec ! [
478+ test_validator_datum( 0 , & pubkeys[ 0 ] , ValidatorStatus :: ActiveOngoing ) ,
479+ test_validator_datum( 1 , & pubkeys[ 1 ] , ValidatorStatus :: ActiveOngoing ) ,
480+ ] ,
481+ )
482+ . mount ( & mock_server)
483+ . await ;
484+
485+ let eth2_cl = EthBeaconNodeApiClient :: with_base_url ( mock_server. uri ( ) )
486+ . expect ( "Failed to create client" ) ;
487+
488+ let cache = ValidatorCache :: new ( eth2_cl, pubkeys) ;
489+
490+ // Test slot 1: fails, falls back to head, returns 2 active, 2 complete,
491+ // refreshed_by_slot=false
492+ let ( active, complete, refreshed_by_slot) = cache
493+ . get_by_slot ( 1 )
494+ . await
495+ . expect ( "`get_by_slot(1)` succeeds via head fallback" ) ;
496+ assert_eq ! ( active. len( ) , 2 ) ;
497+ assert_eq ! ( complete. len( ) , 2 ) ;
498+ assert ! ( !refreshed_by_slot) ;
499+ }
500+
463501 fn test_pubkey ( seed : u8 ) -> PubKey {
464502 let mut bytes = [ 0u8 ; 48 ] ;
465503 bytes[ 0 ] = seed;
0 commit comments