U
    hO                     @   s2   d dl T d dlT d dlmZ G dd dejZdS )    )*)cmf_testcasec                       s  e Zd Zejjdddddg Zdd Zeedd	d
Z	e
dddZd-e
dddZd.eeedddZee
dddZddddddZed/ddZed0ddZed1 fdd	Zdd  Zd!d" Zd#d#ddd$ fd%d&
Zed2ed fd(d)Zee
ed*d+d,Z  ZS )3CmfTestcaseruncopyZgroup_changesgroup_changes_statusesZui_getc                 C   s$   | j r
dS tjjdddgd| _ dS )u   
        Расчет и установка рабочего процесса по умолчанию для тест-кейса.
        Если рабочий процесс уже установлен, ничего не делаем.
        Ntestcase.base:defaultTZsave_eval_code)codeZcache_inmemoryfields)workflowmodelsCmfWorkflowget)self r   (./modules/evatest/models/cmf_testcase.py_calc_workflow   s    zCmfTestcase._calc_workflow)returnc                 C   sB   t | ji d}| jD ]&}tt |jdd |d t |jj< q|S )Nidparamsnamer   )strr   Z
param_setsgetattrZparam_valueZparamr   )	param_rowparam_value_setZtest_case_paramr   r   r   get_value_set   s    
$zCmfTestcase.get_value_setc                 C   sR   g }t jj| ddgdD ] }| |}|d r|| q|sN|di d |S )u  
        Получение всех наборов параметров для тест-кейса.

        Метод собирает наборы значений параметров, связанных с тест-кейсом,
        создавая список словарей, где каждый словарь представляет
        набор значений параметров.

        Returns:
            list: Список наборов значений параметров. Каждый набор - словарь
                  с 'id' и словарем 'params', содержащим имена и значения параметров.
        zparam_sets.paramzparam_sets.param_valueparentr
   r   Nr   )r   CmfTestParamsRowslistr   append)r   param_value_setsr   r   r   r   r   get_param_values_sets    s    

z!CmfTestcase.get_param_values_setsNc              	   C   s  |dkrg }|dkrg }|  dg ddddddd	g}tjjd
d| jgdddgg|dD ]0}|j|j|j|j|j	|j
|jd}|| qXg }tjjd
d| jgdddgg|dD ]0}|j|j|j|j|j	|j
|jd}|| q||dd< t|}||   || |S )u   Получение всех шагов, в том числе и плановых

        Returns:
            list: _description_
        Nfolder--texttestcase_templatestep_sectionexpected_result	test_datacommentr   z==Zsec_pre)filterr
   r&   r'   r(   r)   r*   r+   r   Zsec_postr   )load_fieldsr   CmfTestcaseStepr    r$   r&   r'   r(   r)   r*   r+   r   r!   r   extendget_steps_struct)r   Zpre_condition_stepsZpost_condition_stepsr
   step	step_dictZfolder_stepsstepsr   r   r   get_all_steps_struct=   sb    

	

	
z CmfTestcase.get_all_steps_structr   )parent_stepdepthr   c              	   C   s   |dkrt ddd g }tjj| ddddd	d
dgdD ]}|rL|jjdkrLq6|jj|jj|jj|jj|j	j|j
j|jjd}|r|d |d< |d |d< || |jr6|jj||d d|d< |j |d< q6|S )uo  
        Получение иерархической структуры шагов тест-кейса.

        Метод собирает все шаги тест-кейса, включая вложенные шаги
        из шаблонов тест-кейсов. Поддерживает многоуровневое вложение шагов.

        Args:
            parent_step (dict, optional): Родительский шаг для вложенных шагов. По умолчанию None.
            depth (int, optional): Текущая глубина рекурсии для предотвращения бесконечной рекурсии. По умолчанию 0.

        Returns:
            dict: Список словарей шагов с их деталями и потенциальными вложенными шагами.
        d   uw   Достигнут уровень вложенности 100! Возможна бесконечная рекурсия!T)abortr%   r&   r'   r(   r)   r*   r+   r   mainr-   r   r6      )r6   r7   nested_stepsr"   )Z	cmf_alertr   r/   listr(   valuer&   r'   r)   r*   r+   r   r!   r1   r#   )r   r6   r7   resultr2   r3   r   r   r   r1      sJ    

zCmfTestcase.get_steps_structc              	   C   s\  g }g }di dg}|D ]<}|d t | d}t| D ]\}}|  }	|drz|d tj|d |d}
||
 q8|d r8|d  D ]B\}}|	d	rd
| |	d	 kr|	d	 d
| t	||	d	< q||	d< q8|| t
|D ]f}
t |}g }|
d D ]L}|D ]@}t |}|| |d |d< |d |d |
d |
d < qqqq|S )u'  
        Обработка и выравнивание последовательности шагов с подстановкой параметров.

        Метод обрабатывает сложные сценарии с вложенными шагами и множественными
        наборами параметров. Генерирует все возможные комбинации шагов и значений параметров.

        Args:
            steps (list): Список шагов для обработки
            param_values_sets (list): Список наборов значений параметров

        Returns:
            list: Обработанные группы шагов с подстановками параметров
        Nr   r   )r   group_stepsr<   r;   )indexgroupsr   r&   %Z
parametersrB   r@   rA   )r   	enumerater   r   r   process_step_sequencer!   itemsreplacer   reversed)r4   Zparam_values_setsrB   r<   Zempty_paramsr   groupir2   Zcurrent_stepZnested_stepkeyr>   Z
cur_groupsZnested_groupZ
copy_groupr   r   r   rE      sV    

  



 z!CmfTestcase.process_step_sequence)	testcycletestcycle_testcase_foldertestcase_runc                O   s   |  ddddg d}dg}| j}|rP|jr2|j}|jrD|jj }|jrP|j}|D ]B}	|  D ]4}
tj	||| |
d |	||| j
| j| jd
}|  q`qTdS )uW  
        Выполнение тест-кейса с дополнительными шагами до и после основных шагов.

        Метод обрабатывает полный процесс выполнения тест-кейса, включая:
        - Сбор шагов предусловий
        - Сбор основных шагов тест-кейса
        - Сбор шагов постусловий
        - Создание результатов тестового цикла и прогонов тест-кейсов
        - Сохранение прогонов шагов с потенциальными связями вложенных шагов

        Args:
            testcycle: Тестовый цикл, в котором выполняется тест-кейс
            testcycle_testcase_folder: Папка тест-кейса тестового цикла
            testcase_run: Результат тест-кейса тестового цикла
            pre_condition_steps: Необязательный список шагов для выполнения перед основными шагами теста
            post_condition_steps: Необязательный список шагов для выполнения после основных шагов теста
        estimate_timeresponsiblesignificancer&   Nr   )
r   rM   Ztestcase
params_rowtest_configurationreleaserP   Zcache_estimate_timepriorityr&   )r.   rP   test_configurationsZtestplanrT   loadZdefault_responsibler#   r   ZCmfTestcaseRunrO   rQ   r&   Zsave)r   rL   rM   rN   argskwargsrT   rV   rP   rS   rR   r   r   r   r     s4    zCmfTestcase.runc              	   K   s   |sg }|ddddgddd ggg}|rF| dd rF|dd| dgg}| dd }|r|dddd	| d	gd
dd	| d	gddd	| d	ggg}tjjf |||d|S )NORZ
cmf_hidden=F	parent_idsearchr   ILIKErC   r&   aliasr,   r
   order_by)r   r   ZCmfComponentr=   clsrelation_field_nameobject_fieldsr,   r
   ra   rY   r]   r   r   r   components_options_listL  s     4z#CmfTestcase.components_options_listc                 K   s   |sg }|r,| dd r,|dd| dgg}| dd }|rf|dddd| dgddd| dggg}tjjf |||d	|S )
Nr\   r[   r]   rZ   r   r^   rC   r&   r`   )r   r   ZCmfTestcaseFolderr=   rb   r   r   r   folder_options_list]  s     $zCmfTestcase.folder_options_listc                    sb   |dkr$| j |f||||d|S |dkrH| j|f||||d|S t j||||||f|S )Nr$   )re   r,   r
   ra   
components)rg   rf   superfield_options_list)rc   rd   Zmodels_filtersr
   re   r,   ra   rY   	__class__r   r   rj   n  s      zCmfTestcase.field_options_listc                 C   s<   ddddddg}t jj| |dD ]}|j|j|dd	 q d S )
Nr'   r(   r)   r&   r+   r*   r   T)r   r   copy_attachments)r   r/   r=   r   r   )r   new_obj_fieldsr2   r   r   r   _copy_stepsy  s    zCmfTestcase._copy_stepsc                 C   s(   t jj| dD ]}|j|j|d qd S )N)r   )r   r   )r   r   r=   r   r   )r   rn   Z
test_paramr   r   r   _copy_test_params~  s    zCmfTestcase._copy_test_paramsF)rm   copy_allis_dummyr	   c          	         s6   t  j||||||d|}| | | | |S )N)r   rm   rr   rs   r	   )ri   r   rp   rq   )	r   r   rm   rr   rs   r	   rX   rY   rn   rk   r   r   r     s    

zCmfTestcase.copycsvc                    sj   |sXddddddddd	d
dddddddddddg}t jj D ]}|dr>|| q>t ||||S )Nr   r	   r   r&   zparent.namezfolder.nameZis_templateZdisabledzstatus.namez cache_status_typecmf_author.namezcmf_author.loginzcmf_owner.namezcmf_owner.loginzresponsible.namezresponsible.loginrQ   ZbehaviorZautomation_statustypeZlayerrO   Zcf_)r   r   r
   keys
startswithr!   ri   export2file)rc   field_namesZbqlZformat_fileZinclude_archivedZ
field_namerk   r   r   rx     s,             	
zCmfTestcase.export2file)	subgroupsr   c                 C   s:   |D ]0}t jjdd|d< t jj|d jjd|d< q|S )Nr   )r	   r   )Zworkflow_idZstatus_list)r   r   r   Zget_status_listr   r>   )rc   rz   Zsubgroupr   r   r   r     s    z"CmfTestcase.group_changes_statuses)NN)Nr   )NNNN)NNNN)NNNNN)NNrt   F)__name__
__module____qualname__r   r   Zapi_methodsr   staticmethoddictr   r=   r#   r5   intr1   rE   r   classmethodrf   rg   rj   rp   rq   r   r   rx   r   __classcell__r   r   rk   r   r      sP       

KDI9              
r   N)Zcmf.includeZ
cmf.fieldsZmodules.evatest.fieldsr   r   r   r   r   r   <module>   s   