-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathhandle_request.py
More file actions
197 lines (177 loc) · 7.58 KB
/
handle_request.py
File metadata and controls
197 lines (177 loc) · 7.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# -*- coding: utf-8 -*-
'''
@Time : 2024/01/11 14:46
@Author : Daqiao Wang
@File : handle_request_vars.py
'''
import os
import sys
import pytest
from string import Template
from loguru import logger
import json
from jsonpath import jsonpath
from ast import literal_eval
cur_dir = os.path.dirname(__file__)
project_root_dir = os.path.dirname(cur_dir)
sys.path.append(project_root_dir)
from bases.app_apibase import AppApiBase
def request_url_var_to_str(request_url: str = '', vars_dct: dict = {}) -> str:
"""
Replaces variables in the request URL with values from vars_dct.
Args:
request_url (str): The request URL.
vars_dct (dict): A dictionary containing variable names as keys and their corresponding values.
Returns:
str: The request URL with variables replaced.
"""
if '${' not in request_url:
return request_url
try:
request_url = Template(request_url).substitute(vars_dct)
except Exception as err:
pytest.skip(f'KeyError {err} , because it was not extracted in the previous api\nThe {request_url=}\n{vars_dct=}')
return request_url
def payload_vars_to_dct(payload_str: str = '', vars_dct: dict = {}) -> dict:
"""
Replaces variables in a string with corresponding values from a dictionary.
Args:
payload_str (str): The string containing variables to be replaced.
vars_dct (dict): The dictionary containing variable-value mappings.
Returns:
dict: The dictionary obtained after replacing variables in the string.
"""
if not payload_str:
return None
if '${' not in payload_str:
return json.loads(payload_str)
try:
string_text: str = Template(payload_str).substitute(vars_dct)
except Exception as err:
logger.error(err)
pytest.skip(f'KeyError {err} , because it was not extracted in the previous api\nThe payload is: {payload_str}\n{vars_dct=}')
return
try:
payload_dict = json.loads(string_text)
except json.decoder.JSONDecodeError as err:
logger.error(err)
logger.error(f'{payload_str=}')
logger.error(f'{vars_dct=}')
logger.error(f'{string_text=}')
try:
payload_dict = literal_eval(string_text)
except Exception as err:
payload_dict = string_text
logger.error(err)
finally:
return payload_dict
def preprocess_send_request(case_data, email=None, password=None, vars_dct=None):
"""
A function to preprocess the data & sending a HTTP request.
"""
called_filename = sys._getframe().f_back.f_code.co_filename
called_py, _ = os.path.splitext(os.path.basename(called_filename))
called_py_dir = os.path.dirname(called_filename)
# called_py='test_01_homepage_demo'
logger.info(f'{called_filename=} {called_py_dir=} {called_py=}')
# case data pre-process
request_url = case_data.get('request_url')
http_method = case_data.get('http_method')
data_type = case_data.get('data_type')
params_str = case_data.get('params')
payload_str = case_data.get('payload')
upload_file_name = case_data.get('upload_file', None)
logger.debug(f'{request_url=}')
logger.debug(f'{http_method=}')
if upload_file_name:
upload_file_path = os.path.join(called_py_dir, 'upload_files', upload_file_name)
files = {'file': (os.path.basename(upload_file_path), open(upload_file_path, 'rb'))}
else:
files = None
# logger.debug(f'{vars_dct=}')
# request_url
request_url = request_url_var_to_str(request_url=request_url, vars_dct=vars_dct)
# params_dict
params_dict = payload_vars_to_dct(payload_str=params_str, vars_dct=vars_dct)
logger.debug(f'{params_dict=}')
# payload_dict
payload_dict = payload_vars_to_dct(payload_str=payload_str, vars_dct=vars_dct)
logger.debug(f'{payload_dict=}')
# http request
obj = AppApiBase(url=request_url, http_method=http_method, data_type=data_type, params_dict=params_dict,
payload_dict=payload_dict, files=files, email=email, password=password)
request_info: dict = obj.http_request(called_py=called_py)
request_info.update({'params_dct': params_dict,
'payload_dct': payload_dict,
}
)
'''
request_info = {'request_url': '/post/form',
'method': 'POST',
'data_type': 'data',
'params': '{"q": "hello"}',
'params_dct': {'q': 'hello'},
'payload': '{"name": "John", "age": 19}',
'payload_dct': {'name': 'John', 'age': 19},
'request_length': 38,
'status_code': 200,
'response_data': {'name': 'Jane', 'age': '19', 'message': 'Welcome, you are beautiful.'},
'response_length': 130,
'response_time': 0.030427,
'finish_time': '20240417-18:29:09'}
'''
return request_info
def extract_vars(response_data=None, var_extract: str = '', vars_dct: dict | None = None):
var_extract_dct = json.loads(var_extract)
for k, v in var_extract_dct.items():
tmp_lst = jsonpath(response_data, v)
logger.debug(f'jsonpath get: {tmp_lst=}')
if tmp_lst:
vars_dct[k] = tmp_lst[0]
return vars_dct
class TestSuite:
def test_01(self):
reminder_id = [111, 333]
timsstamp_10days_late = 222
vars_dct = {'reminder_id': reminder_id, 'timsstamp_10days_late': timsstamp_10days_late}
data_str = '{"reminderId":${reminder_id},"scheduleTimestamp":${timsstamp_10days_late},"note":"reminder note2"}'
aa = payload_vars_to_dct(payload_str=data_str, vars_dct=vars_dct)
logger.debug(f'return {aa}')
logger.debug(type(aa))
assert aa == {'reminderId': [111, 333], 'scheduleTimestamp': 222, 'note': 'reminder note2'}
def test_02(self):
data_str = '${user_email}'
vars_dct = {'user_email': 'abcd@aa.info'}
bb = payload_vars_to_dct(payload_str=data_str, vars_dct=vars_dct)
# logger.debug(bb)
logger.debug(f'return {bb}')
logger.debug(type(bb))
assert bb == 'abcd@aa.info'
def test_03(self):
payload_str = '{"recipients":[{"email":"${mail_receiver}","name":"testmail"}],"message":"somethingoptionalmessage","configuration":"{\\"currentStep\\":2,\\"userId\\":\\"${userId}\\",\\"singleCompany\\":true}}","company":"Microsoft","titles":"JavaDeveloper"}'
vars_dct = {'userId': 'abcd1234', 'firstname': 'T', 'history_id': 422776, 'mail_receiver': 'cdccdd@ccc.inf'}
cc = payload_vars_to_dct(payload_str=payload_str, vars_dct=vars_dct)
# logger.debug(cc)
logger.debug(f'return {cc}')
logger.debug(type(cc))
def test_04(self):
payload_str = '[]'
vars_dct = {}
dd = payload_vars_to_dct(payload_str=payload_str, vars_dct=vars_dct)
logger.debug(f'return {dd}')
logger.debug(type(dd))
assert dd == []
def test_05(self):
data_str = '${user_email}'
vars_dct = {}
ee = payload_vars_to_dct(payload_str=data_str, vars_dct=vars_dct)
logger.debug(f'return {ee}')
logger.debug(type(ee))
assert ee is None
def test_06(self):
vars_dct = {'userId': 'abcd1234', 'firstname': 'T', 'history_id': 422777, 'mail_receiver': 'cdccdd@ccc.inf'}
url = request_url_var_to_str(request_url='/v1/${history_id}/history', vars_dct=vars_dct)
logger.debug(f'{url=}')
assert url == '/v1/422777/history'
if __name__ == '__main__':
pytest.main(['-s', '-v'])