U
    ĮwhM                     @   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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d/ddZed0 fdd	Zdd Zd d! Zd"d"ddd# fd$d%
Zed1ed fd'd(Zee
ed)d*d+Z  ZS )2CmfTestcaseruncopyZgroup_changesgroup_changes_statusesc                 C   s   | j r
dS tjjdd| _ dS )u   
        Расчет и установка рабочего процесса по умолчанию для тест-кейса.
        Если рабочий процесс уже установлен, ничего не делаем.
        Ntestcase.base:defaultcode)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parentfieldsr   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   r7      )r7   r8   nested_stepsr#   )Z	cmf_alertr   r0   listr)   valuer'   r(   r*   r+   r,   r   r"   r2   r$   )r   r7   r8   resultr3   r4   r   r   r   r2      sJ    

zCmfTestcase.get_steps_structc              	   C   sR  g }g }|D ]>}|d t | d}t| D ]\}}|  }|drr|d tj|d |d d}	||	 q,|d r,|d  D ]B\}
}|drd	|
 |d kr|d d	|
 t	||d< q||d
< q,|| t
|D ]d}	t |}g }|	d D ]J}|D ]@}t |}|| |d |d< |d |d |	d |	d < qqqq|S )u'  
        Обработка и выравнивание последовательности шагов с подстановкой параметров.

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

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

        Returns:
            list: Обработанные группы шагов с подстановками параметров
        r   )r   group_stepsr=   r<   r#   )indexgroupsr   r'   %Z
parametersrC   rA   rB   )r   	enumerater   r   r   process_step_sequencer"   itemsreplacer   reversed)r5   Zparam_values_setsrC   r=   r   groupir3   Zcurrent_stepZnested_stepkeyr?   Z
cur_groupsZnested_groupZ
copy_groupr   r   r   rF      sT    

  



 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   rN   Ztestcase
params_rowtest_configurationreleaserQ   Zcache_estimate_timepriorityr'   )r/   rQ   test_configurationsZtestplanrU   loadZdefault_responsibler$   r   ZCmfTestcaseRunrP   rR   r'   Zsave)r   rM   rN   rO   argskwargsrU   rW   rQ   rT   rS   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   ILIKErD   r'   aliasr-   r   order_by)r   r   ZCmfComponentr>   clsrelation_field_nameobject_fieldsr-   r   rb   rZ   r^   r   r   r   components_options_listI  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^   r[   r   r_   rD   r'   ra   )r   r   ZCmfTestcaseFolderr>   rc   r   r   r   folder_options_listZ  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%   )rf   r-   r   rb   
components)rh   rg   superfield_options_list)rd   re   Zmodels_filtersr   rf   r-   rb   rZ   	__class__r   r   rk   k  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   r0   r>   r   r   )r   new_obj_fieldsr3   r   r   r   _copy_stepsv  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   ro   Z
test_paramr   r   r   _copy_test_params{  s    zCmfTestcase._copy_test_paramsF)rn   copy_allis_dummyr
   c          	         s6   t  j||||||d|}| | | | |S )N)r   rn   rs   rt   r
   )rj   r   rq   rr   )	r   r   rn   rs   rt   r
   rY   rZ   ro   rl   r   r   r     s    

zCmfTestcase.copycsvc                    sD   |s2ddddddddd	d
dddddddddddg}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.loginrR   ZbehaviorZautomation_statustypeZlayerrP   )rj   export2file)rd   r   ZbqlZformat_fileZinclude_archivedrl   r   r   rw     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?   )rd   rx   Zsubgroupr   r   r   r     s    z"CmfTestcase.group_changes_statuses)NN)Nr   )NNNN)NNNN)NNNNN)NNru   F)__name__
__module____qualname__r   r   Zapi_methodsr   staticmethoddictr   r>   r$   r6   intr2   rF   r   classmethodrg   rh   rk   rq   rr   r   r   rw   r   __classcell__r   r   rl   r   r      sN      

KDF9              
r   N)Zcmf.includeZ
cmf.fieldsZmodules.evatest.fieldsr   r   r   r   r   r   <module>   s   