U
    yb$hgJ                     @   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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d+ fdd	Zdd Zdd Zd d d
d
d! fd"d#
Zd d$ fd%d&
Z  ZS ),CmfTestcaseruncopyc                 C   s   | j r
dS tjjdd| _ dS )u   
        Расчет и установка рабочего процесса по умолчанию для тест-кейса.
        Если рабочий процесс уже установлен, ничего не делаем.
        Nztestcase.base:default)code)ZworkflowmodelsZ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   r2      )r2   r3   nested_stepsr   )Z	cmf_alertr   r+   listr$   valuer"   r#   r%   r&   r'   r   r   r-   r   )r
   r2   r3   resultr.   r/   r   r   r   r-      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_stepsr8   r7   r   )indexgroupsr   r"   %Z
parametersr>   r<   r=   )r   	enumerater	   r   r   process_step_sequencer   itemsreplacer   reversed)r0   Zparam_values_setsr>   r8   r   groupir.   Zcurrent_stepZnested_stepkeyr:   Z
cur_groupsZnested_groupZ
copy_groupr   r   r   rA      sT    

  



 z!CmfTestcase.process_step_sequence)	testcycletestcycle_testcase_foldertestcase_runc                O   s   |  ddg d}dg}| j}|rL|jr.|j}|jr@|jj }|jrL|j}|D ]:}	|  D ],}
tj	||| |
d |	||| j
d}|  q\qPdS )uW  
        Выполнение тест-кейса с дополнительными шагами до и после основных шагов.

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

        Args:
            testcycle: Тестовый цикл, в котором выполняется тест-кейс
            testcycle_testcase_folder: Папка тест-кейса тестового цикла
            testcase_run: Результат тест-кейса тестового цикла
            pre_condition_steps: Необязательный список шагов для выполнения перед основными шагами теста
            post_condition_steps: Необязательный список шагов для выполнения после основных шагов теста
        estimate_timeresponsibleNr   )r   rI   Ztestcase
params_rowtest_configurationreleaserL   Zcache_estimate_time)r*   rL   test_configurationsZtestplanrO   loadZdefault_responsibler   r   ZCmfTestcaseRunrK   Zsave)r
   rH   rI   rJ   argskwargsrO   rP   rL   rN   rM   r   r   r   r     s0    
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   ILIKEr?   r"   aliasr(   r   order_by)r	   r   ZCmfComponentr9   clsrelation_field_nameobject_fieldsr(   r   r[   rS   rW   r   r   r   components_options_listE  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 )
NrV   rU   rW   rT   r   rX   r?   r"   rZ   )r	   r   ZCmfTestcaseFolderr9   r\   r   r   r   folder_options_listV  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    )r_   r(   r   r[   
components)ra   r`   superfield_options_list)r]   r^   Zmodels_filtersr   r_   r(   r[   rS   	__class__r   r   rd   g  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+   r9   r   r   )r
   new_obj_fieldsr.   r   r   r   _copy_stepsr  s    zCmfTestcase._copy_stepsc                 C   s(   t jj| dD ]}|j|j|d qd S )N)r   )r   r   )r   r   r9   r   r   )r
   rh   Z
test_paramr   r   r   _copy_test_paramsw  s    zCmfTestcase._copy_test_paramsF)rg   copy_allis_dummyr   c          	         s6   t  j||||||d|}| | | | |S )N)r   rg   rl   rm   r   )rc   r   rj   rk   )	r
   r   rg   rl   rm   r   rR   rS   rh   re   r   r   r   {  s    

zCmfTestcase.copy)TEXKOM_db_deletec                   sj   t jj| |dD ]}|j|d|i| qt jj| |dD ]}|j|d|i| q:t j|d|i|S )N)r   Zinclude_deletedrn   )r   r+   r9   deleter   rc   )r
   rn   rR   rS   childre   r   r   ro     s
    zCmfTestcase.delete)NN)Nr   )NNNN)NNNN)NNNNN)__name__
__module____qualname__r   r   Zapi_methodsr   staticmethoddictr   r9   r   r1   intr-   rA   r   classmethodr`   ra   rd   rj   rk   r   ro   __classcell__r   r   re   r   r      s>   

KDF7              
r   N)Zcmf.includeZ
cmf.fieldsZmodules.evatest.fieldsr   r   r   r   r   r   <module>   s   