o
    i:                     @  s   d dl mZ d dlZd dlZd dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZ ejrQd dl	mZ d dlmZ d dlmZ d d	lmZ d d
lmZ dZdZeeZG dd dZdd Zdd ZdS )    )annotationsN)Path)item_to_test_ref)TestTag)FixtureRequest)Feature)Scenario)Step)TestOptPlugin
pytest_bddzpytest_bdd.stepc                   @  s   e Zd Zd,ddZd-dd	Zd.ddZejddd/ddZejddd0ddZ	ejddd1d!d"Z
ejddd2d%d&Zd3d)d*Zd+S )4BddTestOptPluginmain_pluginr
   returnNonec                 C  s   || _ |  | _d S N)r   _get_framework_versionframework_version)selfr    r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/pytest/bdd.py__init__    s   zBddTestOptPlugin.__init__strc                 C  s   dd l m} t|dS )Nr   z
pytest-bdd)importlib.metadatametadatar   version)r   importlib_metadatar   r   r   r   $   s   z'BddTestOptPlugin._get_framework_versionfeature_path_strr   c                 C  sF   t | }| jjj}z||W S  ty"   td|| Y |S w )Nz4Feature path %s is not relative to workspace path %s)	r   resolver   managerworkspace_pathrelative_to
ValueErrorlogdebug)r   r   feature_pathr   r   r   r   _get_workspace_relative_path)   s   
z-BddTestOptPlugin._get_workspace_relative_pathT)tryfirstrequestr   featurer   scenarior   c                 C  sx   t |j}| jj|}|std| d S | |jj	}| 
|}|j|jtj< t||jtj< |r:|| d S d S )NzCould not find test %s)r   noder   r   get_testr"   r#   r%   r(   filename_get_codeownersnametagsr   	TEST_NAMEr   
TEST_SUITEset_codeowners)r   r'   r(   r)   test_reftestr$   
codeownersr   r   r   pytest_bdd_before_scenario2   s   

z+BddTestOptPlugin.pytest_bdd_before_scenariostepr	   	step_func
t.Callablec                 C  s   t j}|d u r	d S | }|j|j|jt|dd}|tj	t
 |tjt
 |tj| j | |jj}	| |	}
|tjt|	 |
rP|tjt|
 t|d| d S )NT)resource	span_typechild_ofactivate_datadog_span)ddtracetracercurrent_root_span
start_spantyper.   	STEP_KINDset_tagr   	COMPONENT	FRAMEWORKTEST_FRAMEWORKTEST_FRAMEWORK_VERSIONr   r%   r(   r,   r-   	TEST_FILEr   
CODEOWNERSjsondumpssetattr)r   r'   r(   r)   r7   r8   r@   feature_spanspanr$   r5   r   r   r   pytest_bdd_before_stepB   s(   
z'BddTestOptPlugin.pytest_bdd_before_step)trylaststep_func_argst.Anyc           	      C  sB   t |dd }|d urt|||}|r|tj| |  d S d S )Nr>   )getattr_get_step_func_args_jsonrE   r   
PARAMETERSfinish)	r   r'   r(   r)   r7   r8   rS   rP   step_func_args_jsonr   r   r   pytest_bdd_after_step`   s   
z&BddTestOptPlugin.pytest_bdd_after_step	exception	Exceptionc                 C  st   t |dd }|d ur8t|dr|j}	nt \}
}
}	|r)t|||}|tj| |	t
|||	 |  d S d S )Nr>   __traceback__)rU   hasattrr]   sysexc_inforV   rE   r   rW   set_exc_inforC   rX   )r   r'   r(   r)   r7   r8   rS   r[   rP   tb_rY   r   r   r   pytest_bdd_step_errorq   s   
z&BddTestOptPlugin.pytest_bdd_step_errorr$   t.Optional[list[str]]c                 C  s    | j jj }r|t|S d S r   )r   r   r5   ofr   )r   r$   r5   r   r   r   r-      s   z BddTestOptPlugin._get_codeownersN)r   r
   r   r   )r   r   )r   r   r   r   )r'   r   r(   r   r)   r   r   r   )r'   r   r(   r   r)   r   r7   r	   r8   r9   r   r   )r'   r   r(   r   r)   r   r7   r	   r8   r9   rS   rT   r   r   )r'   r   r(   r   r)   r   r7   r	   r8   r9   rS   rT   r[   r\   r   r   )r$   r   r   re   )__name__
__module____qualname__r   r   r%   pytesthookimplr6   rQ   rZ   rd   r-   r   r   r   r   r      s    



	


r   c              
   C  sh   zt | ||}|rt|W S W dS  ty3 } ztjddd tdt|iW  Y d}~S d}~ww )z=Get step function args as JSON, catching serialization errorsNzCould not serialize argumentsT)r`   error_serializing_args)_extract_step_func_argsrL   rM   	TypeErrorr"   r#   r   )r7   r8   rS   extracted_step_func_argserrr   r   r   rV      s   rV   c           	      C  s   t |dst |ds|S z|jg}W n ty,   z|j}W n ty)   g }Y nw Y nw |D ]K}|durzt|di }i }z.|| j D ]#\}}z||v rU|| |}W n tyd   t	
d Y nw |||< qFW q/ tyy   t	
d Y q/w q/|p~dS )zCBackwards-compatible get arguments from step_func or step_func_argsparser_pytest_bdd_parsersN
converterszargument conversion failed.zargument parsing failed.)r^   rq   AttributeErrorrr   rU   parse_argumentsr.   itemsr\   r"   r#   )	r7   r8   rS   parsersrq   rs   
parametersargvaluer   r   r   rm      s@   

rm   )
__future__r   rL   loggingpathlibr   r_   typingtrj   r?   %ddtrace.testing.internal.pytest.utilsr   "ddtrace.testing.internal.test_datar   TYPE_CHECKINGr   pytest_bdd.parserr   r   r	   &ddtrace.testing.internal.pytest.pluginr
   rG   rD   	getLoggerrg   r"   r   rV   rm   r   r   r   r   <module>   s,    
p