@@ -92,50 +92,13 @@ def log_records(self) -> List[logging.LogRecord]:
9292 """A list of captured log records"""
9393 return self ._log_handler .records
9494
95- def assert_logged_exception (
96- self ,
97- error_type : Type [Exception ],
98- error_pattern : str ,
99- clear_after : bool = True ,
100- ) -> None :
101- """Assert that a given error type and message were logged"""
102- try :
103- re_pattern = re .compile (error_pattern )
104- for record in self .log_records :
105- if record .exc_info is not None :
106- error = record .exc_info [1 ]
107- if isinstance (error , error_type ) and re_pattern .search (str (error )):
108- break
109- else : # pragma: no cover
110- assert False , f"did not raise { error_type } matching { error_pattern !r} "
111- finally :
112- if clear_after :
113- self .log_records .clear ()
114-
115- def raise_if_logged_exception (
116- self ,
117- log_level : int = logging .ERROR ,
118- exclude_exc_types : Union [Type [Exception ], Tuple [Type [Exception ], ...]] = (),
119- clear_after : bool = True ,
120- ) -> None :
121- """Raise the first logged exception (if any)
95+ def url (self , path : str = "" , query : Optional [Any ] = None ) -> str :
96+ """Return a URL string pointing to the host and point of the server
12297
12398 Args:
124- log_level: The level of log to check
125- exclude_exc_types: Any exception types to ignore
126- clear_after: Whether to clear logs after check
99+ path: the path to a resource on the server
100+ query: a dictionary or list of query parameters
127101 """
128- try :
129- for record in self ._log_handler .records :
130- if record .levelno >= log_level and record .exc_info is not None :
131- error = record .exc_info [1 ]
132- if error is not None and not isinstance (error , exclude_exc_types ):
133- raise error
134- finally :
135- if clear_after :
136- self .log_records .clear ()
137-
138- def url (self , path : str = "" , query : Optional [Any ] = None ) -> str :
139102 return urlunparse (
140103 [
141104 "http" ,
@@ -147,6 +110,35 @@ def url(self, path: str = "", query: Optional[Any] = None) -> str:
147110 ]
148111 )
149112
113+ def list_logged_exceptions (
114+ self ,
115+ pattern : Optional [str ] = "" ,
116+ types : Union [Type [Exception ], Tuple [Type [Exception ], ...]] = Exception ,
117+ log_level : int = logging .ERROR ,
118+ del_log_records : bool = True ,
119+ ) -> List [Exception ]:
120+ """Return a list of logged exception matching the given criteria
121+
122+ Args:
123+ log_level: The level of log to check
124+ exclude_exc_types: Any exception types to ignore
125+ del_log_records: Whether to delete the log records for yielded exceptions
126+ """
127+ found : List [Exception ] = []
128+ compiled_pattern = re .compile (pattern )
129+ for index , record in enumerate (self .log_records ):
130+ if record .levelno >= log_level and record .exc_info is not None :
131+ error = record .exc_info [1 ]
132+ if (
133+ error is not None
134+ and isinstance (error , types )
135+ and compiled_pattern .search (str (error ))
136+ ):
137+ if del_log_records :
138+ del self .log_records [index - len (found )]
139+ found .append (error )
140+ return found
141+
150142 def __enter__ (self : _Self ) -> _Self :
151143 self ._log_handler = _LogRecordCaptor ()
152144 logging .getLogger ().addHandler (self ._log_handler )
@@ -161,8 +153,10 @@ def __exit__(
161153 ) -> None :
162154 self .server .stop ()
163155 logging .getLogger ().removeHandler (self ._log_handler )
164- self .raise_if_logged_exception ()
165156 del self .mount , self .server
157+ logged_errors = self .list_logged_exceptions (del_log_records = False )
158+ if logged_errors :
159+ raise logged_errors [0 ]
166160 return None
167161
168162
0 commit comments