U
    jZ                     @   sX   d dl mZ d dlmZ d dlT d dlT d dlmZ d dlm	Z	 G dd de	ej
Z
dS )	    )List)SimpleMapper)*)cmf_testcase)EvaTestCodeMixinc                       sD  e Zd Zejjdddddg Ze fddZdd	 Ze	e
d
ddZed
ddZd2ed
ddZd3e
ee
dddZe	ed
ddZddddddZed4ddZed5ddZed6 fdd 	Zd!d" Zd#d$ Zd%d%ddd& fd'd(
Zeejeej d)d*d+Zed7ed
 fd-d.Zeee
d/d0d1Z  Z S )8CmfTestcaseruncopyZgroup_changesgroup_changes_statusesZui_getc                    s   | dd t j||S )NZinclude_templatesT)
setdefaultsuperslist)clsargskwargs	__class__ (./modules/evatest/models/cmf_testcase.pyr      s    zCmfTestcase.slistc                 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)selfr   r   r   _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   CmfTestParamsRowr   r'   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   r0   r1   r2   r3   r4   r5   r    Zsec_postr   )load_fieldsr   CmfTestcaseStepr   r.   r0   r1   r2   r3   r4   r5   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_structG   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/   r0   r1   r2   r3   r4   r5   r(   mainr7   r    r@      )r@   rA   nested_stepsr,   )Z	cmf_alertr   r9   listr2   valuer0   r1   r3   r4   r5   r    r+   r;   r-   )r   r@   rA   resultr<   r=   r   r   r   r;      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_stepsrF   rE   )indexgroupsr!   r0   %Z
parametersrL   rJ   rK   )r	   	enumerater   r   r   process_step_sequencer+   itemsreplacer#   reversed)r>   Zparam_values_setsrL   rF   Zempty_paramsr&   groupir<   Zcurrent_stepZnested_stepkeyrH   Z
cur_groupsZnested_groupZ
copy_groupr   r   r   rO      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significancer0   Nr    )
r)   rW   Ztestcase
params_rowtest_configurationreleaserZ   Zcache_estimate_timepriorityr0   )r8   rZ   test_configurationsZtestplanr^   loadZdefault_responsibler-   r   ZCmfTestcaseRunrY   r[   r0   Zsave)r   rV   rW   rX   r   r   r^   r`   rZ   r]   r\   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"   ILIKErM   r0   aliasr6   r   order_by)r   r   ZCmfComponentrG   r   relation_field_nameobject_fieldsr6   r   ri   r   re   r   r   r   components_options_listV  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 )
Nrd   rc   re   rb   r"   rf   rM   r0   rh   )r   r   ZCmfTestcaseFolderrG   rj   r   r   r   folder_options_listg  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.   )rl   r6   r   ri   
components)rn   rm   r   field_options_list)r   rk   Zmodels_filtersr   rl   r6   ri   r   r   r   r   rp   x  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 )
Nr1   r2   r3   r0   r5   r4   r(   T)r"   r)   copy_attachments)r   r9   rG   r	   r"   )r   new_obj_fieldsr<   r   r   r   _copy_steps  s    zCmfTestcase._copy_stepsc                 C   s(   t jj| dD ]}|j|j|d qd S )N)r)   )r"   r)   )r   r*   rG   r	   r"   )r   rr   Z
test_paramr   r   r   _copy_test_params  s    zCmfTestcase._copy_test_paramsF)rq   copy_allis_dummyr   c          	         s6   t  j||||||d|}| | | | |S )N)r"   rq   rv   rw   r   )r   r	   rt   ru   )	r   r"   rq   rv   rw   r   r   r   rr   r   r   r   r	     s    

zCmfTestcase.copy)rowr   c                 C   s8  ddl }g }g }t|dr|jrdd |jd j D }|jD ]V}|jrtjj|jj	dg| d}|D ] }| |}	|j
|	_
||	 qhq@|| q@t|d |r*t|D ]v\}
}t }t|D ],}|
dkrt||t|| qt||d qt|D ]}t|d| t|| q|| qn
|| |S )	u  Вызывается на каждую строчку экспорта для дополнительной постобработки данных.
        Превращает testcase.steps в [testcase + step1, step2, step3].
        Если шаг ссылается на testcase_template, его шаги раскрываются.

        Returns:
            list[SimpleMapper.SimpleModel]: Список объектов для экспорта
        r   Nr>   c                 S   s   g | ]}|qS r   r   ).0fr   r   r   
<listcomp>  s     z+CmfTestcase.export_hook.<locals>.<listcomp>r/   )rd   r   zsteps.)r	   hasattrr>   __dict__keysr1   r   r9   r   r    r2   r+   delattrrN   r   SimpleModelvarssetattrr$   )r   rx   r	   r>   rI   Zstep_fieldsr<   Ztemplate_stepsZtemplate_steptsrT   objattrr   r   r   export_hook  s:    	



zCmfTestcase.export_hookcsvc                    sx   |sfdddddddd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rL|| qLt ||||S )Nr    r   r"   r0   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.loginr[   ZbehaviorZautomation_statustypeZlayerrY   z
steps.textzsteps.step_sectionzsteps.expected_resultzsteps.test_datazsteps.commentzsteps.step_numberzsteps.testcase_templateZcf_)r   r   r   r~   
startswithr+   r   export2file)r   field_namesZbqlZformat_fileZinclude_archivedZ
field_namer   r   r   r     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    rH   )r   r   Zsubgroupr   r   r   r
     s    z"CmfTestcase.group_changes_statuses)NN)Nr   )NNNN)NNNN)NNNNN)NNr   F)!__name__
__module____qualname__r   r   Zapi_methodsclassmethodr   r   staticmethoddictr'   rG   r-   r?   intr;   rO   r   rm   rn   rp   rt   ru   r	   r   r   r   r   r#   r   r
   __classcell__r   r   r   r   r   
   sX       

KDI9              
2r   N)typingr   Zcmf.data_providers.baser   Zcmf.includeZ
cmf.fieldsZmodules.evatest.fieldsr   Z-modules.evatest.models.cmf_evatest_code_mixinr   r   r   r   r   r   <module>   s   