U
    f¨Ih<  ã                   @   s®   d dl Z d dlmZmZmZ d dlZd dlZd dlZej	ej
dd e e¡Zeeee dœdd„Zeeee dœd	d
„Zeeeef dœdd„Zdeeee dœdd„ZdS )é    N)ÚOptionalÚListÚDictz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)ÚlevelÚformat)ÚcontentÚ	base_nameÚreturnc              
   C   sä   |r| st  d¡ tdƒ dS tj dd¡}|› d}tj ||¡}zHtj|dd t|d	d
d}| | ¡ W 5 Q R X t  	d|› ¡ |W S  t
k
rÞ } z4t  d|› d|› ¡ td|› d|› ƒ W Y ¢dS d}~X Y nX dS )zÕSave test script to file.

    Args:
        content (str): Content to write to file
        base_name (str): Base name for the file

    Returns:
        Optional[str]: Filename if successful, None otherwise
    z$Filename and content cannot be emptyu(   âŒ Filename and content cannot be emptyNÚtestsÚ	generatedz.txtT©Úexist_okÚwzutf-8)Úencodingz Test script saved successfully: zError saving file z: u   âŒ Error saving file )ÚloggerÚerrorÚprintÚosÚpathÚjoinÚmakedirsÚopenÚwriteÚinfoÚ	Exception)r   r   Ú
output_dirÚfilenameÚ	file_pathÚfileÚe© r    ú?/var/www/html/testcasegenerator.evdpl.com/utils/file_handler.pyÚsave_test_script   s"    


r"   )Ú
test_casesr   r	   c              
      sÒ  |r| st  d¡ tdƒ dS |› d}tj dd¡}tj|dd tj ||¡}z0t| ƒ}|svt  d	¡ t	| ƒ}nBt  d
t
|ƒ› d¡ g }| ¡ D ]\}}t	||d}	| |	¡ q˜|rÆt |¡nt ¡ ‰ ˆ jrt  d¡ tdƒ t dgdgdgdgdgdgdœ¡‰ dˆ jkr"dˆ d< nˆ d  d¡ˆ d< dddddddg}
|
D ]}|ˆ jkrJdˆ |< qJdˆ jkrˆˆ d  dd„ ¡ˆ d< ˆ  d¡‰ ddddddddg}ˆ jD ]}||kr¬| |¡ q¬‡ fdd„|D ƒ}ˆ j|d‰ tj|d d!v}ˆ j|d"d#d$ |jd# }tˆ jƒD ]J\}}tˆ |  t¡ t
¡ ¡ t
|ƒƒ}t|d% d&ƒ|jtd'| ƒ _ qW 5 Q R X t  d(|› ¡ |W S  t!k
rÌ } z(t  d)|› ¡ td*|› ƒ W Y ¢dS d}~X Y nX dS )+zéSave test cases to Excel file.

    Args:
        test_cases (str): Test cases content to write to Excel
        base_name (str): Base name for the file

    Returns:
        Optional[str]: Filename if successful, None otherwise
    z'Filename and test cases cannot be emptyu+   âŒ Filename and test cases cannot be emptyNz.xlsxr
   r   Tr   z6No TEST TYPE sections found, using traditional parsingzFound z TEST TYPE sections)Údefault_sectionzNo test cases could be parsedu$   âš ï¸ No test cases could be parsedzNo test cases foundÚ )ÚSectionÚTitleÚScenarioÚStepsúExpected ResultúActual Resultr&   ÚGeneralr'   r(   r)   r*   r+   ÚStatusÚPriorityc                 S   s*   t | tƒr"d dd„ t| ƒD ƒ¡S | p(dS )NÚ
c                 S   s"   g | ]\}}|d  › d|› ‘qS )é   z. r    )Ú.0ÚiÚstepr    r    r!   Ú
<listcomp>l   s     z7save_excel_report.<locals>.<lambda>.<locals>.<listcomp>r%   )Ú
isinstanceÚlistr   Ú	enumerate)Úxr    r    r!   Ú<lambda>l   ó    z#save_excel_report.<locals>.<lambda>c                    s   g | ]}|ˆ j kr|‘qS r    ©Úcolumns)r1   Úcol©Údfr    r!   r4   y   s     
 z%save_excel_report.<locals>.<listcomp>r;   Zopenpyxl)ZengineFz
Test Cases)ÚindexZ
sheet_nameé   é2   éA   z!Excel report saved successfully: zError saving Excel report: u   âŒ Error saving Excel report: )"r   r   r   r   r   r   r   Úextract_test_type_sectionsr   Úparse_traditional_formatÚlenÚitemsÚextendÚpdZ	DataFrameÚemptyÚwarningr<   ZfillnaÚapplyÚappendZreindexZExcelWriterÚto_excelZsheetsr7   ÚmaxZastypeÚstrÚminZcolumn_dimensionsÚchrÚwidthr   )r#   r   r   r   ÚfilepathÚsectionsÚ	test_dataÚsection_nameÚsection_contentZsection_dataZrequired_columnsr=   Zcolumn_orderÚwriterZ	worksheetÚidxÚ
max_lengthr   r    r>   r!   Úsave_excel_report*   sz    





ú





þ,r\   )r#   r	   c           
      C   sŒ   i }d}t t || ¡ƒ}|s i S t|ƒD ]^\}}| d¡ ¡ }| ¡ }|d t|ƒk rf||d   ¡ nt| ƒ}| ||…  ¡ }	|	||< q(|S )zêExtract sections from test cases content based on TEST TYPE markers.
    
    Args:
        test_cases (str): The full test cases content
        
    Returns:
        Dict[str, str]: Dictionary of section name to section content
    zTEST TYPE:\s*([^\n]+)r0   )	r6   ÚreÚfinditerr7   ÚgroupÚstripÚendrF   Ústart)
r#   rU   Zsection_patternZsection_matchesr2   ÚmatchrW   Ú	start_posÚend_posrX   r    r    r!   rD   ‘   s    	(
rD   r,   )r#   r$   r	   c                 C   sÌ  g }i }|}d}g }t  d|› ¡ d| krÄd| krÄt  d¡ t d| ¡}|D ]N}| ¡ }|rRt|ƒdk rrqRd|krRi }	||	d< t d	|¡}
|
r¨|
 d
¡ ¡ |	d< t d|¡}|rÊ| d
¡ ¡ |	d< t d|¡}|r| d
¡ ¡ }t d|¡}|r||	d< n
|g|	d< t d|tj	¡}|r8| d
¡ ¡ |	d< t d|tj	¡}|r`| d
¡ ¡ |	d< t d|¡}|r„| d
¡ ¡ |	d< | 
|	¡ t  d|	d › ¡ qR|rÄt  dt|ƒ› d¡ |S t  d¡ |  d¡}d}|t|ƒk r”||  ¡ }|d
7 }|sqÜ| d¡r.| dd¡ ¡ p(|}qÜt d |¡}
|
r~|r^|rT||d< | 
|¡ ||
 d
¡ ¡ d!œ}d}g }qÜt d"|¡}|r¬|r¬| d
¡ ¡ |d< qÜt d#|¡}|rÐ|rÐd$}g }qÜ|rvt d%|¡rd}||d< t d&|¡}|rÜ| d
¡ ¡ |d< qÜt d'|¡}|rZ| ¡ d( rB| d)¡n|}| 
| ¡ ¡ qÜn| ¡ rv| 
| ¡ ¡ qÜt d&|¡}|r¤|r¤| d
¡ ¡ |d< qÜt d*|¡}|rÒ|rÒ| d
¡ ¡ |d< qÜt d+|¡}|r |r | d
¡ ¡ |d< qÜ|rÜ|sÜ|rÜd|kr2|d  d,| 7  < n^d|krR|d  d,| 7  < n>d|krr|d  d,| 7  < nd|krÜ|d  d,| 7  < qÜ|r²|r¨||d< | 
|¡ t  dt|ƒ› d-¡ |S ).a
  Parse test cases using the traditional format.
    
    Args:
        test_cases (str): Test cases content to parse
        default_section (str): Default section name if none is specified
        
    Returns:
        List[Dict]: List of test case dictionaries
    Fz)Parsing test cases with default section: zTitle:zSteps to reproduce:zDDetected standard test case format with Title and Steps to reproducez\n\s*\né
   r&   zTitle:\s*(.*?)(?:\n|$)r0   r'   zScenario:\s*(.*?)(?:\n|$)r(   z-Steps to reproduce:([\s\S]*?)Expected Result:zK(?:^|\n)\s*(?:\d+\.\s*|\*\s*|\-\s*)(.*?)(?=\n\s*(?:\d+\.\s*|\*\s*|\-\s*)|$)r)   z6Expected Result:\s*(.*?)(?:Actual Result:|Priority:|$)r*   z%Actual Result:\s*(.*?)(?:Priority:|$)r+   zPriority:\s*(.*?)(?:\n|$)r.   zExtracted test case: z
Extracted z test cases using block parsingz)Using line-by-line parsing for test casesr/   r   z###ú#r%   z/^(?:\d+\.\s*)?(?:\*\*)?Title:(?:\*\*)?\s*(.*?)$)r&   r'   z%^(?:\*\*)?Scenario:(?:\*\*)?\s*(.*?)$z+^(?:\*\*)?Steps(?: to reproduce)?:(?:\*\*)?Tz#^(?:\*\*)?Expected Result:(?:\*\*)?z,^(?:\*\*)?Expected Result:(?:\*\*)?\s*(.*?)$z^(?:(\d+)\.|\-|\*)\s*(.*?)$éÿÿÿÿrA   z*^(?:\*\*)?Actual Result:(?:\*\*)?\s*(.*?)$z%^(?:\*\*)?Priority:(?:\*\*)?\s*(.*?)$Ú z& test cases using line-by-line parsing)r   r   r]   Úsplitr`   rF   Úsearchr_   ÚfindallÚDOTALLrM   ÚdebugÚ
startswithÚreplacerc   Úgroups)r#   r$   rV   Zcurrent_testZcurrent_sectionZcollecting_stepsZcurrent_stepsZtest_case_blocksÚblockÚ	test_caseZtitle_matchZscenario_matchZsteps_matchÚ
steps_textZ
step_linesZexpected_matchZactual_matchZpriority_matchÚlinesr2   ÚlineZer_matchZ
step_matchZ	step_textr    r    r!   rE   °   sì    








þ





rE   )r,   )r   Útypingr   r   r   ÚloggingÚpandasrI   r]   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__r   rP   r"   r\   rD   rE   r    r    r    r!   Ú<module>   s   
g