Загрузка данных
# Функция принимает 5 параметров:
# 1. response: locust.FastResponse (https://docs.locust.io/en/stable/_modules/locust/contrib/fasthttp.html#FastResponse) для HTTP-зарпосов
# и тело ответа для всех асинхронных операций
# 2. Объект операции (то, вы создавали здесь в UI). Формат операции и ее ключи можно посмотреть в итоговом JSON
# 3. Словарь, "переменная": "значение" с локальными переменными потока
# 4. Список созданных листенеров Kafka, WS, gRPC
# 5. Объект класса UserClass
#
# И должна возвращать 4 параметра:
# 1. Успешность операции (None, если успешность должна быть определена стандартными средствами
# В http по коду ответа, в других протоколах всегда успешно))
# 2. id следующей операции (None, если на этом нужно завершить итерацию)
# 3. Словарь, "переменная": "значение" (может быть пустым - {}) для локальных переменных потока
# 4. Словарь, "переменная": "значение" (может быть пустым - {}) для глобальных переменных теста
from typing import NamedTuple, Optional
import re
# from locust.contrib.fasthttp import ResponseContextManager
# from app.clients.class_builder import UserClass
# from app.data_classes.config import OperationTypes
# from app.data_classes.user_vars import UserVar
# from app.users.async_response_readers import AsyncResponseReader, WebSocketResponseReader, KafkaResponseReader
class ReturnFromPostProcessor(NamedTuple):
is_operation_successful: bool
next_operation_id: Optional[str]
local_vars: dict
global_vars: dict
# def post_processor(response: Union[ResponseContextManager, str, bytes], operation: OperationTypes, user_vars: dict[str, UserVar], listeners: list[AsyncResponseReader], user_class: UserClass, *args, **kwargs) -> ReturnFromPostProcessor:
def post_processor(
response, operation, user_vars, listener, user_class, *args, **kwargs
) -> ReturnFromPostProcessor:
if hasattr(response, "status_code") and response.status_code == 200: # if isinstance(response, ResponseContextManager)
if hasattr(response, "headers") and ('set-cookie' in response.headers) and (len(response.headers["set-cookie"]) > 1):
# print("====================================================")
conf = f"{user_class.environment.config=}" # считываем конфиг
position = conf.find("UC51_prelogin_mob_AUTH_pp.py") # находим область, принадлежащую главной (родительской) операции
pacing = conf[position:position+130] # запоминаем интересующую часть конфига
pacing = pacing.split(",")[3] # берем поле constant_pacing
position = pacing.find("'") # считываем граничные значения и вычисляем средний pacing
pacing = pacing[position+1:len(pacing)-1]
position = pacing.find("-")
numA = pacing[0:position]
numB = pacing[position+1:len(pacing)]
#переменные цикла здесь (перенос из локальных)
iteration = 0
total_iterations = 60
# csrftoken= response.json().get("csrftoken")
csrftoken = response.headers["csrftoken"]
# print("csrftoken== "+csrftoken)
# conf = f"{user_class.environment.config=}"
# print("conf== "+conf)
index_header_set_cookies_login = conf.split("UserVar(name='index_header_set_cookies_login', next_value_rule=<NextValueRule.NEVER: 'never'>, select_rule=None, value='")[1][:1]
# print("index_header_set_cookies_login== " + index_header_set_cookies_login) #2
TOKEN = response.headers["set-cookie"][int(index_header_set_cookies_login)]
TOKEN_Split = TOKEN.split(';')[0]
SESSION = response.headers["set-cookie"][int(index_header_set_cookies_login)+1]
SESSION_split = SESSION.split(';')[0]
sessionId = response.json().get("success").get("sbbolSessionId")
return ReturnFromPostProcessor(True, 'UC51_POST_rest_wholesale_client', {"numA":numA, "numB":numB, "iteration":iteration, "total_iterations":total_iterations, "UFS-TOKEN": TOKEN_Split,"UFS-SESSION":SESSION_split,"csrftoken":csrftoken,"sessionId":sessionId}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
elif hasattr(response, "status_code") and response.status_code >= 400:
return ReturnFromPostProcessor(False, None, {}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
# Функция принимает 5 параметров:
# 1. response: locust.FastResponse (https://docs.locust.io/en/stable/_modules/locust/contrib/fasthttp.html#FastResponse) для HTTP-зарпосов
# и тело ответа для всех асинхронных операций
# 2. Объект операции (то, вы создавали здесь в UI). Формат операции и ее ключи можно посмотреть в итоговом JSON
# 3. Словарь, "переменная": "значение" с локальными переменными потока
# 4. Список созданных листенеров Kafka, WS, gRPC
# 5. Объект класса UserClass
#
# И должна возвращать 4 параметра:
# 1. Успешность операции (None, если успешность должна быть определена стандартными средствами
# В http по коду ответа, в других протоколах всегда успешно))
# 2. id следующей операции (None, если на этом нужно завершить итерацию)
# 3. Словарь, "переменная": "значение" (может быть пустым - {}) для локальных переменных потока
# 4. Словарь, "переменная": "значение" (может быть пустым - {}) для глобальных переменных теста
from typing import NamedTuple, Optional
# from locust.contrib.fasthttp import ResponseContextManager
# from app.clients.class_builder import UserClass
# from app.data_classes.config import OperationTypes
# from app.data_classes.user_vars import UserVar
# from app.users.async_response_readers import AsyncResponseReader, WebSocketResponseReader, KafkaResponseReader
class ReturnFromPostProcessor(NamedTuple):
is_operation_successful: bool
next_operation_id: Optional[str]
local_vars: dict
global_vars: dict
# def post_processor(response: Union[ResponseContextManager, str, bytes], operation: OperationTypes, user_vars: dict[str, UserVar], listeners: list[AsyncResponseReader], user_class: UserClass, *args, **kwargs) -> ReturnFromPostProcessor:
def post_processor(
response, operation, user_vars, listener, user_class, *args, **kwargs
) -> ReturnFromPostProcessor:
if hasattr(response, "status_code") and response.status_code == 200: # if isinstance(response, ResponseContextManager)
if hasattr(response, "headers") and ('set-cookie' in response.headers) and (len(response.headers["set-cookie"]) >0):
# print("========================================================================")
prelogin = response.json().get("success").get("srpB")
conf = f"{user_class.environment.config=}"
#print("conf== "+conf)
index_header_set_cookies_prelogin_Split = conf.split("UserVar(name='index_header_set_cookies_prelogin', next_value_rule=<NextValueRule.NEVER: 'never'>, select_rule=None, value='")[1][:2]
#print("index_header_set_cookies_prelogin_Split== " + index_header_set_cookies_prelogin_Split) #2
index_header_set_cookies_prelogin = index_header_set_cookies_prelogin_Split.split("'")[0]
#print("index_header_set_cookies_prelogin== " + index_header_set_cookies_prelogin) #2
# sbbid_session_id_Split='sbbid_session_id=b0d2a6f4-84db-44e1-8960-1a61a449d236' #если включен легаси
if (int(index_header_set_cookies_prelogin)<0):
sbbid_session_id_Split=response.headers["set-cookie"].split(";")[0]
# print(sbbid_session_id_Split) #sbbid_session_id=e811147d-89ee-483e-be80-a53443d66fbf
sbbid_session_id = sbbid_session_id_Split.split('=')[1]
# print(sbbid_session_id) #e811147d-89ee-483e-be80-a53443d66fbf
else:
sbbid_session_id_Split_List = response.headers["set-cookie"][int(index_header_set_cookies_prelogin)]
# print(sbbid_session_id_Split_List)
sbbid_session_id_Split = sbbid_session_id_Split_List.split(';')[0] #sbbid_session_id=df37afb5-df9d-40ba-973f-bbc86ddbc6c1; Path=/; HttpOnly
# print(sbbid_session_id_Split) #sbbid_session_id=df37afb5-df9d-40ba-973f-bbc86ddbc6c1
sbbid_session_id = sbbid_session_id_Split.split('=')[1]
# print(sbbid_session_id) #df37afb5-df9d-40ba-973f-bbc86ddbc6c1
return ReturnFromPostProcessor(True, 'UC29_login_AUTH', {"sbbid_session_id": sbbid_session_id_Split, "prelogin": prelogin}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
elif hasattr(response, "status_code") and response.status_code >= 400:
return ReturnFromPostProcessor(False, None, {}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
# Функция принимает 5 параметров:
# 1. response: locust.FastResponse (https://docs.locust.io/en/stable/_modules/locust/contrib/fasthttp.html#FastResponse) для HTTP-зарпосов
# и тело ответа для всех асинхронных операций
# 2. Объект операции (то, вы создавали здесь в UI). Формат операции и ее ключи можно посмотреть в итоговом JSON
# 3. Словарь, "переменная": "значение" с локальными переменными потока
# 4. Список созданных листенеров Kafka, WS, gRPC
# 5. Объект класса UserClass
#
# И должна возвращать 4 параметра:
# 1. Успешность операции (None, если успешность должна быть определена стандартными средствами
# В http по коду ответа, в других протоколах всегда успешно))
# 2. id следующей операции (None, если на этом нужно завершить итерацию)
# 3. Словарь, "переменная": "значение" (может быть пустым - {}) для локальных переменных потока
# 4. Словарь, "переменная": "значение" (может быть пустым - {}) для глобальных переменных теста
from typing import NamedTuple, Optional
# from locust.contrib.fasthttp import ResponseContextManager
# from app.clients.class_builder import UserClass
# from app.data_classes.config import OperationTypes
# from app.data_classes.user_vars import UserVar
# from app.users.async_response_readers import AsyncResponseReader, WebSocketResponseReader, KafkaResponseReader
class ReturnFromPostProcessor(NamedTuple):
is_operation_successful: bool
next_operation_id: Optional[str]
local_vars: dict
global_vars: dict
# def post_processor(response: Union[ResponseContextManager, str, bytes], operation: OperationTypes, user_vars: dict[str, UserVar], listeners: list[AsyncResponseReader], user_class: UserClass, *args, **kwargs) -> ReturnFromPostProcessor:
def post_processor(
response, operation, user_vars, listener, user_class, *args, **kwargs
) -> ReturnFromPostProcessor:
if hasattr(response, "status_code") and response.status_code == 200: # if isinstance(response, ResponseContextManager)
return ReturnFromPostProcessor(True, 'UC29_create_AUTH', {}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
# Функция принимает 5 параметров:
# 1. response: locust.FastResponse (https://docs.locust.io/en/stable/_modules/locust/contrib/fasthttp.html#FastResponse) для HTTP-зарпосов
# и тело ответа для всех асинхронных операций
# 2. Объект операции (то, вы создавали здесь в UI). Формат операции и ее ключи можно посмотреть в итоговом JSON
# 3. Словарь, "переменная": "значение" с локальными переменными потока
# 4. Список созданных листенеров Kafka, WS, gRPC
# 5. Объект класса UserClass
#
# И должна возвращать 4 параметра:
# 1. Успешность операции (None, если успешность должна быть определена стандартными средствами
# В http по коду ответа, в других протоколах всегда успешно))
# 2. id следующей операции (None, если на этом нужно завершить итерацию)
# 3. Словарь, "переменная": "значение" (может быть пустым - {}) для локальных переменных потока
# 4. Словарь, "переменная": "значение" (может быть пустым - {}) для глобальных переменных теста
from typing import NamedTuple, Optional
# from locust.contrib.fasthttp import ResponseContextManager
# from app.clients.class_builder import UserClass
# from app.data_classes.config import OperationTypes
# from app.data_classes.user_vars import UserVar
# from app.users.async_response_readers import AsyncResponseReader, WebSocketResponseReader, KafkaResponseReader
class ReturnFromPostProcessor(NamedTuple):
is_operation_successful: bool
next_operation_id: Optional[str]
local_vars: dict
global_vars: dict
# def post_processor(response: Union[ResponseContextManager, str, bytes], operation: OperationTypes, user_vars: dict[str, UserVar], listeners: list[AsyncResponseReader], user_class: UserClass, *args, **kwargs) -> ReturnFromPostProcessor:
def post_processor(
response, operation, user_vars, listener, user_class, *args, **kwargs
) -> ReturnFromPostProcessor:
if hasattr(response, "status_code") and response.status_code == 200: # if isinstance(response, ResponseContextManager)
if hasattr(response, "headers") and ('set-cookie' in response.headers) and (len(response.headers["set-cookie"]) > 1):
p_csrfToken = response.json().get("csrfToken")
TOKEN = response.headers["set-cookie"][1]
# print("====================================================")
TOKEN_Split = TOKEN.split(';')[0]
SESSION = response.headers["set-cookie"][2]
SESSION_split = SESSION.split(';')[0]
return ReturnFromPostProcessor(True, 'UC29_decrypt_AUTH', {"p_csrfToken":p_csrfToken,"UFS-TOKEN": TOKEN_Split,"UFS-SESSION":SESSION_split}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})
# Функция принимает 5 параметров:
# 1. response: locust.FastResponse (https://docs.locust.io/en/stable/_modules/locust/contrib/fasthttp.html#FastResponse) для HTTP-зарпосов
# и тело ответа для всех асинхронных операций
# 2. Объект операции (то, вы создавали здесь в UI). Формат операции и ее ключи можно посмотреть в итоговом JSON
# 3. Словарь, "переменная": "значение" с локальными переменными потока
# 4. Список созданных листенеров Kafka, WS, gRPC
# 5. Объект класса UserClass
#
# И должна возвращать 4 параметра:
# 1. Успешность операции (None, если успешность должна быть определена стандартными средствами
# В http по коду ответа, в других протоколах всегда успешно))
# 2. id следующей операции (None, если на этом нужно завершить итерацию)
# 3. Словарь, "переменная": "значение" (может быть пустым - {}) для локальных переменных потока
# 4. Словарь, "переменная": "значение" (может быть пустым - {}) для глобальных переменных теста
from typing import NamedTuple, Optional
# from locust.contrib.fasthttp import ResponseContextManager
# from app.clients.class_builder import UserClass
# from app.data_classes.config import OperationTypes
# from app.data_classes.user_vars import UserVar
# from app.users.async_response_readers import AsyncResponseReader, WebSocketResponseReader, KafkaResponseReader
class ReturnFromPostProcessor(NamedTuple):
is_operation_successful: bool
next_operation_id: Optional[str]
local_vars: dict
global_vars: dict
# def post_processor(response: Union[ResponseContextManager, str, bytes], operation: OperationTypes, user_vars: dict[str, UserVar], listeners: list[AsyncResponseReader], user_class: UserClass, *args, **kwargs) -> ReturnFromPostProcessor:
def post_processor(
response, operation, user_vars, listener, user_class, *args, **kwargs
) -> ReturnFromPostProcessor:
if hasattr(response, "status_code") and response.status_code == 200: # if isinstance(response, ResponseContextManager)
csrftoken = response.json().get("data")
return ReturnFromPostProcessor(True, 'UC29_GET_contacts_WEB',{"csrftoken":csrftoken}, {})
else:
return ReturnFromPostProcessor(False, None, {}, {})