5
5
# this file be licensed under the Apache-2.0 license or a
6
6
# compatible open source license.
7
7
8
+ import io
8
9
import logging
9
10
import os
11
+ from logging import Handler
10
12
from pathlib import Path
11
- from typing import Any
13
+ from typing import Any , Tuple
12
14
13
15
import requests
14
16
from openapi_core import Spec , validate_request , validate_response
17
19
from manifests .test_manifest import TestManifest
18
20
from test_workflow .smoke_test .smoke_test_runner import SmokeTestRunner
19
21
from test_workflow .test_args import TestArgs
22
+ from test_workflow .test_recorder .test_result_data import TestResultData
20
23
from test_workflow .test_result .test_component_results import TestComponentResults
21
24
from test_workflow .test_result .test_result import TestResult
22
25
from test_workflow .test_result .test_suite_results import TestSuiteResults
@@ -64,6 +67,31 @@ def validate_response_swagger(self, response: Any) -> None:
64
67
validate_response (response = response , spec = self .spec_ , request = request )
65
68
logging .info ("Response is validated." )
66
69
70
+ def record_test_result (self , component : str , test_api : str , api_action : str , stdout : str , stderr : str ) -> None :
71
+ test_config = f"{ api_action } _{ test_api .replace ('/' , '_' )} "
72
+ logging .info (f"Recording test result for { component } component, config { test_config } " )
73
+ file_path = self .test_recorder ._create_base_folder_structure (component , test_config )
74
+ self .test_recorder ._generate_std_files (stdout , stderr , file_path )
75
+
76
+ def setup_logging_buffers (self ) -> Tuple [io .StringIO , io .StringIO , logging .StreamHandler , logging .StreamHandler ]:
77
+ info_buffer = io .StringIO ()
78
+ error_buffer = io .StringIO ()
79
+
80
+ info_handler = logging .StreamHandler (info_buffer )
81
+ error_handler = logging .StreamHandler (error_buffer )
82
+
83
+ info_handler .setLevel (logging .INFO )
84
+ error_handler .setLevel (logging .ERROR )
85
+
86
+ logging .getLogger ().addHandler (info_handler )
87
+ logging .getLogger ().addHandler (error_handler )
88
+
89
+ return info_buffer , error_buffer , info_handler , error_handler
90
+
91
+ def cleanup_logging_handlers (self , info_handler : Handler , error_handler : Handler ) -> None :
92
+ logging .getLogger ().removeHandler (info_handler )
93
+ logging .getLogger ().removeHandler (error_handler )
94
+
67
95
def start_test (self , work_dir : Path ) -> TestSuiteResults :
68
96
url = "https://localhost:9200"
69
97
@@ -76,9 +104,11 @@ def start_test(self, work_dir: Path) -> TestSuiteResults:
76
104
test_results = TestComponentResults ()
77
105
for api_requests , api_details in component_spec .items ():
78
106
request_url = '' .join ([url , api_requests ])
79
- logging .info (f"Validating api request { api_requests } " )
80
- logging .info (f"API request URL is { request_url } " )
81
107
for method in api_details .keys (): # Iterates over each method, e.g., "GET", "POST"
108
+ info_buffer , error_buffer , info_handler , error_handler = self .setup_logging_buffers ()
109
+
110
+ logging .info (f"Validating api request { api_requests } " )
111
+ logging .info (f"API request URL is { request_url } " )
82
112
requests_method = getattr (requests , method .lower ())
83
113
parameters_data = self .convert_parameter_json (api_details .get (method ).get ("parameters" ))
84
114
header = api_details .get (method ).get ("header" , self .mimetype )
@@ -87,15 +117,27 @@ def start_test(self, work_dir: Path) -> TestSuiteResults:
87
117
status = 0
88
118
try :
89
119
response = requests_method (request_url , verify = False , auth = ("admin" , "myStrongPassword123!" ), headers = header , data = parameters_data )
90
- logging .info (f"Response is { response .text } " )
120
+ logging .info (f"Response is \n { response .text } " )
91
121
self .validate_response_swagger (response )
92
122
except Exception as e :
93
123
status = 1
94
124
logging .error (f"Unexpected Error type is { type (e )} " )
95
125
logging .error (e )
96
126
logging .info ("Response is not validated. Please check the response output text above." )
97
127
finally :
128
+ self .record_test_result (component .name , api_requests , method , info_buffer .getvalue (), error_buffer .getvalue ())
98
129
test_result = TestResult (component .name , ' ' .join ([api_requests , method ]), status ) # type: ignore
130
+ test_result_data_local = TestResultData (
131
+ component .name ,
132
+ f"{ method } _{ api_requests .replace ('/' , '_' )} " ,
133
+ status ,
134
+ info_buffer .getvalue (),
135
+ error_buffer .getvalue (),
136
+ {}
137
+ )
138
+ self .test_recorder .test_results_logs .generate_component_yml (test_result_data_local )
139
+ self .cleanup_logging_handlers (info_handler , error_handler )
99
140
test_results .append (test_result )
141
+
100
142
all_results .append (component .name , test_results )
101
143
return all_results
0 commit comments