
    k/i-P                     \    d dl  d dl d dlmZ d dlmZ  G d deej                        Zy)    )*)cmf_testcase)EvaTestCodeMixinc                   R    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                 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    (./modules/evatest/models/cmf_testcase.py_calc_workflowzCmfTestcase._calc_workflow   s3    
 ==**..4K\`jzi{.|    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     "%Y\\!2bA  )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   CmfTestParamsRowslistr)   append)r   param_value_setsr&   r'   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   Nc           	      &   |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z--texttestcase_templatestep_sectionexpected_result	test_datacommentr,   ==)r7   r;   sec_pre)filterr   r5   r6   r7   r8   r9   r:   r   )r7   r;   sec_postr   )load_fieldsr   CmfTestcaseStepr.   r3   r5   r6   r7   r8   r9   r:   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 
 	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)abortr4   r+   mainr>   r   rK   r7      )rK   rL   nested_stepsr0   )	cmf_alertr   rA   listr7   valuer5   r6   r8   r9   r:   r   r/   rC   r1   )r   rK   rL   resultrF   rG   s         r   rC   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_stepsrR   rQ   )indexgroupsr   r5   %
parametersrZ   rX   rY   )r	   	enumerater   r   r   process_step_sequencer/   itemsreplacer!   reversed)rI   param_values_setsrZ   rR   empty_paramsr'   groupirF   current_stepnested_stepkeyrU   
cur_groupsnested_group
copy_groups                   r   r^   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significancer5   Nr   )
r,   rm   testcase
params_rowtest_configurationreleaserq   cache_estimate_timepriorityr5   )r@   rq   test_configurationstestplanrv   loaddefault_responsibler1   r   CmfTestcaseRunrp   rr   r5   save)r   rl   rm   rn   argskwargsrv   ry   rq   ru   rt   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    ILIKEr[   r5   aliasr=   r   order_by )r   r   CmfComponentrT   clsrelation_field_nameobject_fieldsr=   r   r   r   r   s           r   components_options_listz#CmfTestcase.components_options_listN  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   r[   r5   r   r   )r   r   CmfTestcaseFolderrT   r   s           r   folder_options_listzCmfTestcase.folder_options_list_  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 )Nr3   )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_listp  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)r6   r7   r8   r5   r:   r9   r+   T)r    r,   copy_attachments)r   rA   rT   r	   r    )r   new_obj_fieldsrF   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-   rT   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   c                     |sTg d}t         j                  j                  j                         D ]%  }|j	                  d      s|j                  |       ' t        |   ||||      S )N)r   r   r    r5   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.loginrr   behaviorautomation_statustypelayerrp   cf_)r   r   r   keys
startswithr/   r   export2file)r   field_namesbqlformat_fileinclude_archived
field_namer   s         r   r   zCmfTestcase.export2file  sh    '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   rU   )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_methodsr   staticmethoddictr)   rT   r1   rJ   intrC   r^   r   classmethodr   r   r   r   r   r	   r!   r   r   __classcell__)r   s   @r   r   r      sQ   **66 :
 
K} $   t  :H[_ HVB4 BC Bd BH D D DR "&7$r ]ac c  ]ah h  B BM
B 49UUY`d  Tcf T T$ d t  r   r   N)cmf.include
cmf.fieldsmodules.evatest.fieldsr   -modules.evatest.models.cmf_evatest_code_mixinr   r   r   r   r   <module>r      s(      / J["L$<$< [r   