Загрузка данных


# Функция принимает 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, {}, {})