
    iC[                         d dl mZmZmZmZ d dlmZ d dl d dl d dl	m
Z
 d dlmZ  G d dee
j                        Zy)	    )ListDictOptionalAny)SimpleMapper)*)cmf_testcase)EvaTestCodeMixinc                       e Zd Zej                  j
                  g dz   Ze fd       Zd Ze	de
eef   fd       Zdee   fdZddee   d	ee   defd
Zddee   dedee   fdZe	de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ej<                  deej<                     fd       Zed"def fd       Z edee   de
eef   fd       Z! xZ"S )#CmfTestcase)runcopygroup_changesgroup_changes_statusesui_getc                 F    |j                  dd       t        |   |i |S )Ninclude_templatesT)
setdefaultsuperslist)clsargskwargs	__class__s      (./modules/evatest/models/cmf_testcase.pyr   zCmfTestcase.slist   s(    -t4w}d-f--    c                 n    | j                   ryt        j                  j                  dddg      | _         y)u   
        Расчет и установка рабочего процесса по умолчанию для тест-кейса.
        Если рабочий процесс уже установлен, ничего не делаем.
        Ntestcase.base:defaultTsave_eval_code)codecache_inmemoryfields)workflowmodelsCmfWorkflowget)selfs    r   _calc_workflowzCmfTestcase._calc_workflow   s3    
 ==**..4K\`jzi{.|r   returnc                     t        | j                        i d}| j                  D ]E  }t        t        |j                        dd       |d   t        |j
                  j                        <   G |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   sr     25Y\\1Bb*Q  )33 	AOIPQTUdUpUpQqsy{  JAOH%c/*?*?*D*D&EF	Ar   c                     g }t         j                  j                  | ddg      D ]*  }| j                  |      }|d   s|j	                  |       , |s|j	                  di d       |S )u  
        Получение всех наборов параметров для тест-кейса.

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

        Returns:
            list: Список наборов значений параметров. Каждый набор - словарь
                  с 'id' и словарем 'params', содержащим имена и значения параметров.
        zparam_sets.paramzparam_sets.param_valueparentr"   r-   Nr+   )r$   CmfTestParamsRowr   r7   append)r'   param_value_setsr4   r5   s       r   get_param_values_setsz!CmfTestcase.get_param_values_sets)   s     ')0066&(@A 7 
 	9I #00;Ox( ''8	9  ##42$>?r   Npre_condition_stepspost_condition_stepsc           	      &   |g }|g }| j                  dg       g d}t        j                  j                  dd| j                  gg dg|      D ]c  }|j
                  |j                  |j                  |j                  |j                  |j                  |j                  d}|j                  |       e g }t        j                  j                  dd| j                  gg dg|      D ]c  }|j
                  |j                  |j                  |j                  |j                  |j                  |j                  d}|j                  |       e ||d	d	 t        |      }|j                  | j                                |j                  |       |S )
u   Получение всех шагов, в том числе и плановых

        Returns:
            list: _description_
        folder--texttestcase_templatestep_sectionexpected_result	test_datacommentr:   ==)rG   rK   sec_pre)filterr"   rE   rF   rG   rH   rI   rJ   r,   )rG   rK   sec_postr   )load_fieldsr$   CmfTestcaseStepr   rB   rE   rF   rG   rH   rI   rJ   r,   r<   r   extendget_steps_struct)r'   r?   r@   r"   step	step_dictfolder_stepsstepss           r   get_all_steps_structz CmfTestcase.get_all_steps_structF   s    &"$'#%  	($
 **004-1  1 
 	2D 		%)%;%; $ 1 1#'#7#7!^^<<ggI  &&y1!	2& **004-2  1 
 	+D 		%)%;%; $ 1 1#'#7#7!^^<<ggI 	*!	+& %1Qq! ()T**,-)*r   parent_stepdepthc           	         |dkD  rt        dd       g }t        j                  j                  | g d      D ]%  }|r|j                  j
                  dk7  r |j                  j
                  |j                  j
                  |j                  j
                  |j                  j
                  |j                  j
                  |j                  j
                  |j                  j
                  d}|r|d	   |d
<   |d   |d<   |j                  |       |j                  s|j                  j                  ||dz         |d<   |j                  j                         |d<   ( |S )uo  
        Получение иерархической структуры шагов тест-кейса.

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

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

        Returns:
            dict: Список словарей шагов с их деталями и потенциальными вложенными шагами.
        d   uw   Достигнут уровень вложенности 100! Возможна бесконечная рекурсия!T)abortrC   r9   mainrN   r,   rY   rG      )rY   rZ   nested_stepsr=   )	cmf_alertr$   rQ   listrG   valuerE   rF   rH   rI   rJ   r,   r<   rS   r>   )r'   rY   rZ   resultrT   rU   s         r   rS   zCmfTestcase.get_steps_struct   s]    3; J
 **// 0 
 )	D t0066&@ 		%)%;%;%A%A $ 1 1 7 7#'#7#7#=#=!^^11<<--ggmmI +6t+<	-(,7,G	.)MM)$ %%**;;	Y^abYb;c .) **@@B ,-O)	V r   c           	         g }g }di dg}|D ]^  }|d   t        |       d}t        |       D ]  \  }}|j                         }	|j                  d      r;|dz   t        j                  j                  |d   |      d}
|j                  |
       b|d   sh|d   j                         D ]F  \  }}|	j                  d	      sd
| |	d	   v s#|	d	   j                  d
| t        |            |	d	<   H ||	d<    |j                  |       t        |      D ]U  }
t        |      }g }|
d   D ]>  }|D ]7  }t        |      }|j                  |       |d   |d<   |d   |d   |
d   |
d    9 @ W a |S )u'  
        Обработка и выравнивание последовательности шагов с подстановкой параметров.

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

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

        Returns:
            list: Обработанные группы шагов с подстановками параметров
        Nr+   r,   )r,   group_stepsr`   r_   )indexgroupsr-   rE   %
parametersrh   rf   rg   )r   	enumerater&   r$   r   process_step_sequencer<   itemsreplacer/   reversed)rW   param_values_setsrh   r`   empty_paramsr5   groupirT   current_stepnested_stepkeyrc   
cur_groupsnested_group
copy_groups                   r   rl   z!CmfTestcase.process_step_sequence   s    #r23  1 /	8O*40eME$U+ E4#yy{ 88N+!"Q"("4"4"J"J 0,##K !''4 'x0*9(*C*I*I*K AJC , 0 0 8&'uIf1E$E7C$*8"")'AcU)SZ"@ !-V 4A 6E\23E6 MM%   (5 8!&\
 %0$9 8L!+ 8%)%[
j1+7+=
4( )7 #=1'0;w3G	888E/	8b r   )	testcycletestcycle_testcase_foldertestcase_runc                   | j                  g d       d}dg}| j                  }|r`|j                  r|j                  }|j                  r$|j                  j                  j                         }|j                  r|j                  }|D ]g  }	| j                         D ]R  }
t        j                  ||| |
d   |	||| j                  | j                  | j                  
      }|j                          T i y)uW  
        Выполнение тест-кейса с дополнительными шагами до и после основных шагов.

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

        Args:
            testcycle: Тестовый цикл, в котором выполняется тест-кейс
            testcycle_testcase_folder: Папка тест-кейса тестового цикла
            testcase_run: Результат тест-кейса тестового цикла
            pre_condition_steps: Необязательный список шагов для выполнения перед основными шагами теста
            post_condition_steps: Необязательный список шагов для выполнения после основных шагов теста
        )estimate_timeresponsiblesignificancerE   Nr,   )
r:   r{   testcase
params_rowtest_configurationreleaser   cache_estimate_timepriorityrE   )rP   r   test_configurationstestplanr   loaddefault_responsibler>   r$   CmfTestcaseRunr~   r   rE   save)r'   rz   r{   r|   r   r   r   r   r   r   r   s              r   r   zCmfTestcase.run  s    2 	QR#g&&,,&/&C&C#!!#,,4499;,,';;"5 	$"88: $
%44$.G!)$/'9# +(,(:(:!..  5   !!#$	$r   c           	         |sg }|dg dg dgg}|r(|j                  dd       r|dd|j                  d      gg}|j                  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.   ILIKEri   rE   aliasrM   r"   order_by )r&   r$   CmfComponentrb   r   relation_field_nameobject_fieldsrM   r"   r   r   r   s           r   components_options_listz#CmfTestcase.components_options_listU  s     F4!;=VWX]..{DA{C1B1B;1OPQFHd+1VHA?67VWX^W__`TaBbfmovz{  }C  |D  DE  yF  fG  HF ""''bvfxb[abbr   c                     |sg }|r(|j                  dd       r|dd|j                  d      gg}|j                  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   ri   rE   r   r   )r&   r$   CmfTestcaseFolderrb   r   s           r   folder_options_listzCmfTestcase.folder_options_listf  s     F]..{DA{C1B1B;1OPQFHd+1VHA?67VWX^W__`TaBbcF '',,gF6T\g`fggr   c                     |dk(  r | j                   |f||||d|S |dk(  r | j                  |f||||d|S t        |   ||||||fi |S )NrB   )r   rM   r"   r   
components)r   r   r   field_options_list)	r   r   models_filtersr"   r   rM   r   r   r   s	           r   r   zCmfTestcase.field_options_listw  s    (**3**+> Zmdj5;hZRXZ Z,..3../B ZR_hn5;hZRXZ Zw)*=~vWdflnv  B  {A  B  	Br   c                     g d}t         j                  j                  | |      D ]   }|j                  |j                  |d       " y )N)rF   rG   rH   rE   rJ   rI   r9   T)r.   r:   copy_attachments)r$   rQ   rb   r   r.   )r'   new_obj_fieldsrT   s       r   _copy_stepszCmfTestcase._copy_steps  sD    h**//tG/L 	MDII499WtIL	Mr   c                     t         j                  j                  |       D ]  }|j                  |j                  |       ! y )N)r:   )r.   r:   )r$   r;   rb   r   r.   )r'   r   
test_params      r   _copy_test_paramszCmfTestcase._copy_test_params  s;     1166d6C 	BJOOOA	Br   F)r   copy_allis_dummyr    c          	      v    t        	|   ||||||d|}| j                  |       | j                  |       |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  sT    ',4BR]epx  @D  O  HN  O!w'r   rowc           
      v   ddl }g }g }t        |d      r|j                  r|j                  d   j                  j	                         D cg c]  }| }}|j                  D ]  }|j
                  rtt        j                  j                  |j
                  j                  dg|z         }|D ]5  }	|j                  |	      }
|j                  |
_
        |j                  |
       7 |j                  |        t        |d       |rt        |      D ]  \  }}t        j                         }t!        |      D ],  }|dk(  rt#        ||t%        ||              t#        ||d       . t!        |      D ]  }t#        |d| t%        ||              |j                  |        |S |j                  |       |S c c}w )u  Вызывается на каждую строчку экспорта для дополнительной постобработки данных.
        Превращает testcase.steps в [testcase + step1, step2, step3].
        Если шаг ссылается на testcase_template, его шаги раскрываются.

        Returns:
            list[SimpleMapper.SimpleModel]: Список объектов для экспорта
        r   NrW   rD   )r   r"   zsteps.)r   hasattrrW   __dict__keysrF   r$   rQ   r   r,   rG   r<   delattrrk   r   SimpleModelvarssetattrr1   )r   r   r   rW   rd   fstep_fieldsrT   template_stepstemplate_steptsrs   objattrs                 r   export_hookzCmfTestcase.export_hook  s    	3 SYY&)iil&;&;&@&@&BC1CKC		 '))%+%;%;%A%A"&"8"8";"; $v3 &B &N *8 )!YY}5*.*;*;R()
 LL&' C!$U+ #4"..0 I 1DAvT73+=>T401 !J GDC6$'$2EFGc"#  MM#A Ds   
	F6c                     |sTg d}t         j                  j                  j                         D ]%  }|j	                  d      s|j                  |       ' t        |   ||||      S )N)r,   r    r.   rE   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.loginr   behaviorautomation_statustypelayerr~   z
steps.textzsteps.step_sectionzsteps.expected_resultzsteps.test_datazsteps.commentzsteps.step_numberzsteps.testcase_templatecf_)r$   r   r"   r   
startswithr<   r   export2file)r   field_namesbqlformat_fileinclude_archived
field_namer   s         r   r   zCmfTestcase.export2file  si    jK %0077<<> 3
((/&&z23 w";[BRSSr   	subgroupsc                     |D ]_  }t         j                  j                  d      |d<   t         j                  j                  |d   j                  j
                        |d<   a |S )Nr   )r    r#   )workflow_idstatus_list)r$   r%   r&   get_status_listr,   rc   )r   r   subgroups      r   r   z"CmfTestcase.group_changes_statuses  sk    ! 	tH#)#5#5#9#9?V#9#WHZ &,&8&8&H&HU]^hUiUlUlUrUr&H&sH]#	t r   )NN)Nr   )NNNN)NNNNN)NNcsvF)#__name__
__module____qualname__r	   r   api_methodsclassmethodr   r(   staticmethodr   r/   r   r7   r   r>   r   rX   dictintrS   rl   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   	   s   **66 :
 
K . .} DcN   tCy  :H Hemnres H  @D HVBHTN B# BV^_cVd BH D49 D DR "&7$r ]ac c  ]ah h  B BM
B 49UUY`d  /l66 /4@X@X;Y / /d Tcf T T( tCy T#s(^  r   r   N)typingr   r   r   r   cmf.data_providers.baser   cmf.include
cmf.fieldsmodules.evatest.fieldsr	   -modules.evatest.models.cmf_evatest_code_mixinr
   r   r   r   r   <module>r      s1    , , 0   / JV"L$<$< Vr   