
    Y~hN                     H    d dl T d dlT d dlmZ  G d dej                  ZdS )    )*)cmf_testcasec                   h    e Zd Zej        j        g dz   Zd Zedefd            Z	de
fdZdde
fdZdd	ed
edefdZede
fd            ZdddddZe	 dd            Ze	 dd            Zed fd	            Zd Zd Zddddd fd
Zeddef fd            Zede
defd            Z xZS ) CmfTestcase)runcopygroup_changesgroup_changes_statusesui_getc                 b    | j         rdS t          j                            d          | _         dS )u   
        Расчет и установка рабочего процесса по умолчанию для тест-кейса.
        Если рабочий процесс уже установлен, ничего не делаем.
        Ntestcase.base:defaultcode)workflowmodelsCmfWorkflowget)selfs    (./modules/evatest/models/cmf_testcase.py_calc_workflowzCmfTestcase._calc_workflow   s3    
 = 	F*..4K.LL    returnc                     t          | j                  i d}| j        D ]E}t          t          |j                  dd           |d         t          |j        j                  <   F|S )Nidparamsnamer   )strr   
param_setsgetattrparam_valueparamr   )	param_rowparam_value_settest_case_params      r   get_value_setzCmfTestcase.get_value_set   sz     "%Y\!2!2bAA  )3 	A 	AOIPQTUdUpQqQqsy{  JA  JAOH%c/*?*D&E&EFFr   c                     g }t           j                            | ddg          D ]4}|                     |          }|d         r|                    |           5|s|                    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$   s       r   get_param_values_setsz!CmfTestcase.get_param_values_sets    s     066&(@A 7 
 
 	9 	9I #00;;Ox( 9 ''888 	@##42$>$>???r   Nc           	         |g }|g }|                      dg           g d}t          j                            dd| j        gg dg|          D ]D}|j        |j        |j        |j        |j	        |j
        |j        d}|                    |           Eg }t          j                            dd| j        gg d	g|          D ]D}|j        |j        |j        |j        |j	        |j
        |j        d}|                    |           E||d
d
<   t          |          }|                    |                                            |                    |           |S )u   Получение всех шагов, в том числе и плановых

        Returns:
            list: _description_
        Nfolderz--texttestcase_templatestep_sectionexpected_result	test_datacommentr)   ==)r5   r9   sec_pre)filterr*   r3   r4   r5   r6   r7   r8   r   )r5   r9   sec_postr   )load_fieldsr   CmfTestcaseStepr,   r1   r3   r4   r5   r6   r7   r8   r   r-   r   extendget_steps_struct)r   pre_condition_stepspost_condition_stepsr*   step	step_dictfolder_stepsstepss           r   get_all_steps_structz CmfTestcase.get_all_steps_struct=   s    &"$'#%  	($$$
 
 
 *004-111  1 
 
 	2 	2D 	%)%; $ 1#'#7!^<g I  &&y1111 *004-222  1 
 
 	+ 	+D 	%)%; $ 1#'#7!^<g I 	**** %1QqS! ())T**,,---)***r   r   parent_stepdepthc           	      .   |dk    rt          dd           g }t          j                            | g d          D ]}|r|j        j        dk    r|j        j        |j        j        |j        j        |j        j        |j	        j        |j
        j        |j        j        d}|r|d	         |d
<   |d         |d<   |                    |           |j        r>|j                            ||dz             |d<   |j                                        |d<   |S )uo  
        Получение иерархической структуры шагов тест-кейса.

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

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

        Returns:
            dict: Список словарей шагов с их деталями и потенциальными вложенными шагами.
        d   uw   Достигнут уровень вложенности 100! Возможна бесконечная рекурсия!T)abortr2   r(   mainr<   r   rI   r5      )rI   rJ   nested_stepsr.   )	cmf_alertr   r?   listr5   valuer3   r4   r6   r7   r8   r   r-   rA   r/   )r   rI   rJ   resultrD   rE   s         r   rA   zCmfTestcase.get_steps_struct   sj    3;; J   
 *//   0 
 
 )	 )	D  t06&@@ 	%)%;%A $ 1 7#'#7#=!^1<-gm I  H+6t+<	-(,7,G	.)MM)$$$ % *;;	Y^abYb;cc .) *@@BB ,- r   c           	         g }g }di dg}|D ]}|d         t          |           d}t          |           D ]\  }}|                                 }	|                    d          rB|dz   t          j                            |d         |          d}
|                    |
           p|d         rv|d                                         D ]V\  }}|	                    d	          r<d
| |	d	         v r/|	d	                             d
| t          |                    |	d	<   W||	d<   |                    |           t          |          D ]q}
t          |          }g }|
d         D ]U}|D ]P}t          |          }|                    |           |d         |d<   |d         |d         |
d         |
d         <   QVr|S )u'  
        Обработка и выравнивание последовательности шагов с подстановкой параметров.

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

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

        Returns:
            list: Обработанные группы шагов с подстановками параметров
        Nr   r   )r   group_stepsrP   rO   )indexgroupsr   r3   %
parametersrX   rV   rW   )r   	enumerater   r   r   process_step_sequencer-   itemsreplacer   reversed)rG   param_values_setsrX   rP   empty_paramsr$   groupirD   current_stepnested_stepkeyrS   
cur_groupsnested_group
copy_groups                   r   r\   z!CmfTestcase.process_step_sequence   sH    #r223  1 /	8 /	8O*40eMME$U++ E E4#yy{{ 88N++ E!"Q"("4"J"J 0,# ## #K !''4444 'x0 	E*9(*C*I*I*K*K A AJC , 0 0 8 8A$-IIf1E$E$E7C$*8"")')c))SZZ"@"@ !-V 4 6E\2MM%     (55 8 8!&\\
 %0$9 8 8L!+ 8 8%)%[[
j111+7+=
4( )7 #=1'0;w3GG 	888 r   )	testcycletestcycle_testcase_foldertestcase_runc                   |                      g d           d}dg}| j        }|rA|j        r|j        }|j        r|j        j                                        }|j        r|j        }|D ]f}	|                                 D ]O}
t          	                    ||| |
d         |	||| j
        | j        | j        
  
        }|                                 PgdS )uW  
        Выполнение тест-кейса с дополнительными шагами до и после основных шагов.

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

        Args:
            testcycle: Тестовый цикл, в котором выполняется тест-кейс
            testcycle_testcase_folder: Папка тест-кейса тестового цикла
            testcase_run: Результат тест-кейса тестового цикла
            pre_condition_steps: Необязательный список шагов для выполнения перед основными шагами теста
            post_condition_steps: Необязательный список шагов для выполнения после основных шагов теста
        )estimate_timeresponsiblesignificancer3   Nr   )
r)   rk   testcase
params_rowtest_configurationreleasero   cache_estimate_timepriorityr3   )r>   ro   test_configurationstestplanrt   loaddefault_responsibler/   r   CmfTestcaseRunrn   rp   r3   save)r   rj   rk   rl   argskwargsrt   rw   ro   rs   rr   s              r   r   zCmfTestcase.run  s   2 	QQQRRR#g& 	<, D&/&C#! <#,499;;, <';"5 	$ 	$"88:: $ $
%44$.G!)$/'9# +(,(:!.  5     !!####$	$ 	$r   c           	      "   |sg }|dg dg dgg}|r0|                     dd           r|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        d|||d|S )NOR)
cmf_hidden=F)r   r   N	parent_idr   searchr   ILIKErY   r3   aliasr;   r*   order_by )r   r   CmfComponentrR   clsrelation_field_nameobject_fieldsr;   r*   r   r~   r   s           r   components_options_listz#CmfTestcase.components_options_listL  s     	F4!;!;!;=V=V=VWX 	R]..{DAA 	R{C1B1B;1O1OPQFHd++ 	V?67TaX^TaTaTaBbfmov  yF  }C  yF  yF  yF  fG  HF "'bvfxbb[abbbr   c                     |sg }|r0|                     dd           r|dd|                     d          gg}|                     dd           }|r|dddd| dgddd| dggg}t          j        j        d
|||d	|S )Nr   r   r   r   r   r   rY   r3   r   r   )r   r   CmfTestcaseFolderrR   r   s           r   folder_options_listzCmfTestcase.folder_options_list]  s      	F 	R]..{DAA 	R{C1B1B;1O1OPQFHd++ 	V?67TaX^TaTaTaBbcF ',gF6T\gg`fgggr   c                     |dk    r | j         |f||||d|S |dk    r | j        |f||||d|S  t                      j        ||||||fi |S )Nr1   )r   r;   r*   r   
components)r   r   superfield_options_list)	r   r   models_filtersr*   r   r;   r   r~   	__class__s	           r   r   zCmfTestcase.field_options_listn  s    (***3*+> Zmdj5;hZ ZRXZ Z Z,...3./B ZR_hn5;hZ ZRXZ Z Z)uww)*=~vWdflnv  B  B  {A  B  B  	Br   c                     g d}t           j                            | |          D ]}|                    |j        |d            d S )N)r4   r5   r6   r3   r8   r7   r(   T)r   r)   copy_attachments)r   r?   rR   r   r   )r   new_obj_fieldsrD   s       r   _copy_stepszCmfTestcase._copy_stepsy  s]    hhh*//tG/LL 	M 	MDII49WtILLLL	M 	Mr   c                     t           j                            |           D ]}|                    |j        |           d S )N)r)   )r   r)   )r   r+   rR   r   r   )r   r   
test_params      r   _copy_test_paramszCmfTestcase._copy_test_params~  sN     166d6CC 	B 	BJOOOAAAA	B 	Br   F)r   copy_allis_dummyr   c          	           t                      j        ||||||d|}|                     |           |                     |           |S )N)r   r   r   r   r   )r   r   r   r   )
r   r   r   r   r   r   r}   r~   r   r   s
            r   r   zCmfTestcase.copy  sp    %'',4BR]epx  @D  O  O  HN  O  O!!!w'''r   csvc                 X    |sg d}t                                          ||||          S )N)r   r   r   r3   zparent.namezfolder.nameis_templatedisabledzstatus.namez cache_status_typecmf_author.namezcmf_author.loginzcmf_owner.namezcmf_owner.loginzresponsible.namezresponsible.loginrp   behaviorautomation_statustypelayerrn   )r   export2file)r   r*   bqlformat_fileinclude_archivedr   s        r   r   zCmfTestcase.export2file  s=     	'' ' 'F ww""63=MNNNr   	subgroupsc                     |D ]X}t           j                            d          |d<   t           j                            |d         j        j                  |d<   Y|S )Nr   r   r   )workflow_idstatus_list)r   r   r   get_status_listr   rS   )r   r   subgroups      r   r
   z"CmfTestcase.group_changes_statuses  sf    ! 	t 	tH#)#5#9#9?V#9#W#WHZ &,&8&H&HU]^hUiUlUr&H&s&sH]##r   )NN)Nr   )NNNN)NNNNN)NNr   F)__name__
__module____qualname__r   r   api_methodsr   staticmethoddictr&   rR   r/   rH   intrA   r\   r   classmethodr   r   r   r   r   r   r   r   r
   __classcell__)r   s   @r   r   r      s       *6 :
 :
 :
 
KM M M $    \ t        :H H[_ H H H HVB B4 BC Bd B B B BH D D D D \DR "&7$ 7$ 7$ 7$ 7$r ]ac c c [c  ]ah h h [h  B B B B B [BM M M
B B B 49UUY`d        O O^a O O O O O [O d t    [    r   r   N)cmf.include
cmf.fieldsmodules.evatest.fieldsr   r   r   r   r   <module>r      sp            / / / / / /V V V V V,* V V V V Vr   