@@ -45,6 +45,19 @@ impl StorageReaderServerHandler<TestRequest, TestResponse> for TestHandler {
4545 }
4646}
4747
48+ #[ derive( Clone ) ]
49+ struct ErrorHandler ;
50+
51+ #[ async_trait]
52+ impl StorageReaderServerHandler < TestRequest , TestResponse > for ErrorHandler {
53+ async fn handle_request (
54+ _storage_reader : & StorageReader ,
55+ _request : TestRequest ,
56+ ) -> Result < TestResponse , StorageError > {
57+ Err ( StorageError :: DBInconsistency { msg : "Test error" . to_string ( ) } )
58+ }
59+ }
60+
4861#[ tokio:: test]
4962async fn test_endpoint_successful_query ( ) {
5063 let ( ( reader, mut writer) , _temp_dir) = get_test_storage ( ) ;
@@ -123,6 +136,66 @@ async fn test_endpoint_query_nonexistent_block() {
123136 assert ! ( !test_response. found) ;
124137}
125138
139+ #[ tokio:: test]
140+ async fn test_endpoint_handler_error ( ) {
141+ let ( ( reader, _writer) , _temp_dir) = get_test_storage ( ) ;
142+
143+ let socket = SocketAddr :: from ( ( TEST_SERVER_IP , 8083 ) ) ;
144+ let config = ServerConfig :: new ( socket, true ) ;
145+
146+ let server =
147+ StorageReaderServer :: < ErrorHandler , TestRequest , TestResponse > :: new ( reader. clone ( ) , config) ;
148+ let app = server. app ( ) ;
149+
150+ let request = TestRequest { block_number : 0 } ;
151+ let response = app
152+ . oneshot (
153+ Request :: builder ( )
154+ . method ( "POST" )
155+ . uri ( "/storage/query" )
156+ . header ( "content-type" , "application/json" )
157+ . body ( Body :: from ( serde_json:: to_string ( & request) . unwrap ( ) ) )
158+ . unwrap ( ) ,
159+ )
160+ . await
161+ . unwrap ( ) ;
162+
163+ assert_eq ! ( response. status( ) , StatusCode :: INTERNAL_SERVER_ERROR ) ;
164+
165+ let body = to_bytes ( response) . await ;
166+ let error_message = String :: from_utf8 ( body. to_vec ( ) ) . unwrap ( ) ;
167+ assert ! ( error_message. contains( "Storage error" ) ) ;
168+ assert ! ( error_message. contains( "Test error" ) ) ;
169+ }
170+
171+ #[ tokio:: test]
172+ async fn test_endpoint_invalid_json ( ) {
173+ let ( ( reader, _writer) , _temp_dir) = get_test_storage ( ) ;
174+
175+ let socket = SocketAddr :: from ( ( TEST_SERVER_IP , 8084 ) ) ;
176+ let config = ServerConfig :: new ( socket, true ) ;
177+
178+ let server =
179+ StorageReaderServer :: < TestHandler , TestRequest , TestResponse > :: new ( reader. clone ( ) , config) ;
180+ let app = server. app ( ) ;
181+
182+ // Test with invalid JSON
183+ let response = app
184+ . oneshot (
185+ Request :: builder ( )
186+ . method ( "POST" )
187+ . uri ( "/storage/query" )
188+ . header ( "content-type" , "application/json" )
189+ . body ( Body :: from ( "invalid json" ) )
190+ . unwrap ( ) ,
191+ )
192+ . await
193+ . unwrap ( ) ;
194+
195+ // Should return error status code
196+ assert ! ( !response. status( ) . is_success( ) ) ;
197+ }
198+
126199// Helper function to convert response body to bytes
127200async fn to_bytes ( res : Response ) -> Bytes {
128201 res. into_body ( ) . collect ( ) . await . unwrap ( ) . to_bytes ( )
0 commit comments