
    @iO                     N    d dl  d dl d dlmZ  G d dej                        Zy)    )*)cmf_testcasec                   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+   ==)r6   r:   sec_pre)filterr   r4   r5   r6   r7   r8   r9   r   )r6   r:   sec_postr   )load_fieldsr   CmfTestcaseStepr-   r2   r4   r5   r6   r7   r8   r9   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)abortr3   r*   mainr=   r   rJ   r6      )rJ   rK   nested_stepsr/   )	cmf_alertr   r@   listr6   valuer4   r5   r7   r8   r9   r   r.   rB   r0   )r   rJ   rK   resultrE   rF   s         r   rB   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_stepsrQ   rP   )indexgroupsr   r4   %
parametersrY   rW   rX   )r   	enumerater   r   r   process_step_sequencer.   itemsreplacer    reversed)rH   param_values_setsrY   rQ   empty_paramsr&   groupirE   current_stepnested_stepkeyrT   
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significancer4   Nr   )
r+   rl   testcase
params_rowtest_configurationreleaserp   cache_estimate_timepriorityr4   )r?   rp   test_configurationstestplanru   loaddefault_responsibler0   r   CmfTestcaseRunro   rq   r4   save)r   rk   rl   rm   argskwargsru   rx   rp   rt   rs   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   ILIKErZ   r4   aliasr<   r   order_by )r   r   CmfComponentrS   clsrelation_field_nameobject_fieldsr<   r   r   r   r   s           r   components_options_listz#CmfTestcase.components_options_listL  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   rZ   r4   r   r   )r   r   CmfTestcaseFolderrS   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 )Nr2   )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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)r5   r6   r7   r4   r9   r8   r*   T)r   r+   copy_attachments)r   r@   rS   r   r   )r   new_obj_fieldsrE   s       r   _copy_stepszCmfTestcase._copy_stepsy  sD    h**//tG/L 	MDII499WtIL	Mr   c                     t         j                  j                  |       D ]  }|j                  |j                  |       ! y )N)r+   )r   r+   )r   r,   rS   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   r4   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.loginrq   behaviorautomation_statustypelayerro   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   rT   )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(   rS   r0   rI   intrB   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   r   r   r   r   <module>r      s"      /[,** [r   