
    iA                     :   d Z ddlZddlmc mZ ddlmZm	Z	mZ ddl
mZ ddlZddlmZmZmZ ddlmZ ddej        ej        d	dd
dddf
dedededededee         dz  dededededefdZej        dedefd            Z G d d          Z G d d          ZdS ) z.Tests for Obsidian Markdown report generation.    N)UTCdatedatetime)Path)NoveltyScenarioTypeUseCaseObsidianReporterabc123def456zTest Use CaseTtestuserzhttps://example.com/post
hackernewszA test summary.idtitlenoveltyscenariois_real_valuetoolsauthorurlplatformsummaryreturnc
                     t          j        t                    }
t          di d| d|d|	d|d|d|d|
d	|
d
|d|pdgddddddd|d|dg ddS )N)tzr   r   r   
source_urlsource_platformr   published_atcollected_atscenario_type
tools_usedClaudehas_local_dataThas_workflow_optvalue_scoreg?r   r   similar_to_idsraw_contentraw )r   nowr   r	   )r   r   r   r   r   r   r   r   r   r   r*   s              ;/root/projects/ai_usecases_explorer/tests/test_reporters.py_usecaser,      s     ,#


C   2e  3	
 ! v S S h &XJ t  C $m   r!" E#     tmp_pathc                 "    t          |           S )N
output_dirr
   )r.   s    r+   reporterr2   -   s    x0000r-   c                       e Zd ZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfd	Z	deddfd
Z
deddfdZdeddfdZdS )TestObsidianReporterGenerater2   r   Nc                    t                      g}|                    |t          ddd                    }t          |t                    }|sddt          j                    v st          j        t                    rt          j	        t                    nddt          j                    v st          j        |          rt          j	        |          nddt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |          d	z  }t          t          j        |                    d }d S )
N        report_datez5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancemdstr)py0py1py2py4)r,   generater   r;   r=   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation)selfr2   usecasesr<   @py_assert3@py_format5s         r+   test_returns_markdown_stringz9TestObsidianReporterGenerate.test_returns_markdown_string3   s:   JJ<xT$25F5FGG"c"""""""""""""""z"""""z"""""""""""""""""""""""""""""""""c"""""c""""""""""""""""""""""""""r-   c                    t                      g}|                    |t          ddd                    }d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          ndd	z  }d
d|iz  }t          t          j
        |                    d x}}d S )Nr6   r7   r8   r9   
2026-02-27inz%(py1)s in %(py3)sr<   r?   py3assert %(py5)spy5)r,   rB   r   rE   _call_reprcomparerG   rC   rD   rF   rH   rI   )rJ   r2   rK   r<   @py_assert0@py_assert2@py_format4@py_format6s           r+   test_includes_date_in_headerz9TestObsidianReporterGenerate.test_includes_date_in_header8   s    JJ<xT$25F5FGG!|r!!!!!!!!!!|r!!!!!|!!!!!!!!!!!r!!!!!r!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r-   c                 p   t          ddt          j                  }t          ddt          j                  }t          ddt          j                  }|||g}|                    |t          d	d
d                    }g }d}||v }	|	}
|	sd}|j        } |            }||v }|}
|
s~t          j	        d|	fd||f          t          j
        |          dt          j                    v st          j        |          rt          j
        |          nddz  }dd|iz  }|                    |           |	st          j	        d|fd||f          t          j
        |          dt          j                    v st          j        |          rt          j
        |          ndt          j
        |          t          j
        |          dz  }dd|iz  }|                    |           t          j        |d          i z  }dd|iz  }t!          t          j        |                    d x}
x}x}x}	x}x}x}}d S )Nhn001r   )r   r   red001redditlow001Fr   r   r6   r7   r8   r9   HNrQ   z%(py3)s in %(py5)sr<   rU   rW   %(py7)spy7zJ%(py10)s in %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.lower
}()
}py10py12py14py16%(py18)spy18   assert %(py21)spy21)r,   r   NEWSIMILARREPEATrB   r   lowerrE   rX   rG   rC   rD   rF   append_format_booloprH   rI   )rJ   r2   hn_itemreddit_itemfiltered_itemrK   r<   @py_assert1rZ   @py_assert4rY   @py_assert9@py_assert13@py_assert15@py_assert11r\   @py_format8@py_format17@py_format19@py_format20@py_format22s                        r+   test_includes_scan_summary_linez<TestObsidianReporterGenerate.test_includes_scan_summary_line=   s   7\7;OOOx(GOTTT WWW[-8xT$25F5FGG77t7trz77777\7RX7XXZZ7\Z777777777777tr77777t77777777777r77777r77777777777777777777777777777\Z77777\77777777777R77777R777777X7777Z7777777777777777777777777777777777777777777777777777777777777r-   c                    t          dt          j                  }t          dt          j                  }|                    ||gt          ddd                    }d}||v }|st          j        d	|fd
||f          t          j        |          dt          j
                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}}|j        }	|	|v }
|
st          j        d	|
fd|	|f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |	          dt          j
                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}	}
d S )Nnew001r   sim001r6   r7   r8   r9   u	   新场景rQ   rS   r<   rT   rV   rW   )z-%(py2)s
{%(py2)s = %(py0)s.title
} in %(py4)snew_ucr>   r@   rA   zassert %(py6)spy6)r,   r   rt   ru   rB   r   rE   rX   rG   rC   rD   rF   rH   rI   r   )rJ   r2   r   
similar_ucr<   rY   rZ   r[   r\   r}   rL   rM   @py_format7s                r+   &test_new_section_contains_new_usecaseszCTestObsidianReporterGenerate.test_new_section_contains_new_usecasesF   s   (GK888h@@@

3dArARARSS {b          {b     {           b     b                           |!|r!!!!!!!!!!|r!!!!!!!!!!!!v!!!!!v!!!!!!|!!!!!!!!!!!r!!!!!r!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r-   c                    t          dt          j                  }|                    |gt	          ddd                    }g }d}||v }|}|sd}||v }	|	}|sXt          j        d	|fd
||f          t          j        |          dt          j	                    v st          j
        |          rt          j        |          nddz  }
dd|
iz  }|                    |           |st          j        d	|	fd||f          t          j        |          dt          j	                    v st          j
        |          rt          j        |          nddz  }dd|iz  }|                    |           t          j        |d          i z  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}	d S )Nr   r   r6   r7   r8   r9   u   已知场景u	   新案例rQ   re   r<   rf   rg   rh   )z%(py10)s in %(py12)s)rk   rl   z%(py14)srm   rq   zassert %(py17)spy17)r,   r   ru   rB   r   rE   rX   rG   rC   rD   rF   rx   ry   rH   rI   )rJ   r2   r   r<   r}   rZ   r~   rY   r   r   r\   r   @py_format13@py_format15@py_format16@py_format18s                   r+   .test_similar_section_contains_similar_usecaseszKTestObsidianReporterGenerate.test_similar_section_contains_similar_usecasesM   s$   h@@@

|dAr9J9JKK88~8~#88888{8{b'888888888888~88888~888888888888888888888888888888888888888888888{b88888{88888888888b88888b88888888888888888888888888888888888888888888888888888888888r-   c                    t          dt          j                  g}|                    |t	          ddd                    }g }d}||v }|}|sd}|j        }	 |	            }
||
v }|}|s~t          j        d	|fd
||f          t          j        |          dt          j
                    v st          j        |          rt          j        |          nddz  }dd|iz  }|                    |           |st          j        d	|fd||
f          t          j        |          dt          j
                    v st          j        |          rt          j        |          ndt          j        |	          t          j        |
          dz  }dd|iz  }|                    |           t          j        |d          i z  }dd|iz  }t          t          j        |                    d x}x}x}x}x}x}x}	}
d S )NFrc   r6   r7   r8   r9   u   过滤filterrQ   re   r<   rf   rg   rh   ri   rj   ro   rp   rq   rr   rs   )r,   r   rv   rB   r   rw   rE   rX   rG   rC   rD   rF   rx   ry   rH   rI   )rJ   r2   rK   r<   r}   rZ   r~   rY   r   r   r   r   r\   r   r   r   r   r   s                     r+   test_filter_log_section_presentz<TestObsidianReporterGenerate.test_filter_log_section_presentR   s^   5'.IIIJxT$25F5FGG77x7x2~777777RX7XXZZ7Z!777777777777x277777x77777777777277777277777777777777777777777777777Z7777777777777777R77777R777777X7777Z7777777777777777777777777777777777777777777777777777777777777r-   c                    t          dt          j        ddg          }|                    |gt	          ddd                    }d}||v }|st          j        d	|fd
||f          t          j        |          dt          j	                    v st          j
        |          rt          j        |          nddz  }dd|iz  }t          t          j        |                    d x}}d S )Nr   zClaude CodePython)r   r   r6   r7   r8   r9   rQ   rS   r<   rT   rV   rW   )r,   r   rt   rB   r   rE   rX   rG   rC   rD   rF   rH   rI   )rJ   r2   r   r<   rY   rZ   r[   r\   s           r+   test_tools_shown_in_new_sectionz<TestObsidianReporterGenerate.test_tools_shown_in_new_sectionW   s   (GKx?XYYYxT$25F5FGG"}""""""""""}"""""}"""""""""""""""""""""""""""""""""""""""""""""r-   c                    |                     g t          ddd                    }d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          ndd	z  }d
d|iz  }t          t          j	        |                    d x}}t          |          }d}||k    }|st          j        d|fd||f          dt          j                    v st          j        t                    rt          j        t                    nddt          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j	        |
                    d x}x}}d S )Nr6   r7   r8   r9   rP   rQ   rS   r<   rT   rV   rW   2   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slen)r>   r?   rU   r   assert %(py8)spy8)rB   r   rE   rX   rG   rC   rD   rF   rH   rI   r   )rJ   r2   r<   rY   rZ   r[   r\   @py_assert5r~   r   @py_format9s              r+   )test_empty_usecases_produces_valid_reportzFTestObsidianReporterGenerate.test_empty_usecases_produces_valid_report\   s   rtD!R/@/@AA!|r!!!!!!!!!!|r!!!!!|!!!!!!!!!!!r!!!!!r!!!!!!!!!!!!!!!!!!!!!!!!!!!2www|wss22wr-   c                 2   t          dt          j        t          j                  }t          dt          j        t          j                  }|                    ||gt          ddd                    }t          j        }|j        }||v }|st          j
        d|fd	||f          d
t          j                    v st          j        t                    rt          j        t                    nd
t          j        |          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j        |	                    d x}x}}t          j        }|j        }||v }|st          j
        d|fd||f          d
t          j                    v st          j        t                    rt          j        t                    nd
t          j        |          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }	t          t          j        |	                    d x}x}}d S )Ns1)r   r   s2r6   r7   r8   r9   rQ   )zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.CODE_GEN_REVIEW
}.value
} in %(py6)sr   r<   )r>   r@   rA   r   r   r   )zV%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.WORKFLOW_AUTOMATION
}.value
} in %(py6)s)r,   r   ru   r   CODE_GEN_REVIEWWORKFLOW_AUTOMATIONrB   r   valuerE   rX   rC   rD   rF   rG   rH   rI   )
rJ   r2   uc1uc2r<   r}   rL   r   r   r   s
             r+   $test_groups_similar_by_scenario_typezATestObsidianReporterGenerate.test_groups_similar_by_scenario_typea   s   tW_|?[\\\tW_|?_```SztD!R7H7HII+7+171R77777777771R777777777777|77777|777777+7777177777777777R77777R77777777777777777777777777777/;/5;5;;;;;;;;;;5;;;;;;;;;;;;|;;;;;|;;;;;;/;;;;5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r-   )__name__
__module____qualname__r   rN   r]   r   r   r   r   r   r   r   r)   r-   r+   r4   r4   2   sS       #5E #$ # # # #
"5E "$ " " " "
88H 8T 8 8 8 8"?O "TX " " " "9GW 9\` 9 9 9 9
88H 8T 8 8 8 8
#8H #T # # # #
BR W[    
<=M <RV < < < < < <r-   r4   c                   F    e Zd ZdededdfdZdededdfdZdeddfdZdS )TestObsidianReporterWriter2   r.   r   Nc                 :   t                      g}t          ddd          }|                    ||          }|j        } |            }|sddt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          dz  }t          t          j
        |                    d x}}|j        }d}	||	k    }|st          j        d	|fd
||	f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j
        |                    d x}x}}	d S )Nr6   r7   r8   r9   Aassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}pathr   z2026-02-27.md)==)z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)s)r>   r@   rW   zassert %(py7)srh   )r,   r   writeexistsrC   rD   rE   rF   rG   rH   rI   namerX   )rJ   r2   r.   rK   r:   r   r}   rL   rM   r~   r\   r   s               r+   test_writes_file_to_output_dirz8TestObsidianReporterWrite.test_writes_file_to_output_dirj   s   JJ<4B''~~hK~@@{{{}}}tt{}y+O+yO++++++++++yO++++++++++++t+++++t++++++y++++O+++++++++++++++++++++++++++++r-   c                    t                      g}|                    |t          ddd                    }|                    d          }d}||v }|st	          j        d|fd	||f          t	          j        |          d
t          j                    v st	          j	        |          rt	          j        |          nd
dz  }dd|iz  }	t          t	          j        |	                    d x}}d S )Nr6   r7   r8   r9   zutf-8)encodingrP   rQ   rS   contentrT   rV   rW   )r,   r   r   	read_textrE   rX   rG   rC   rD   rF   rH   rI   )
rJ   r2   r.   rK   r   r   rY   rZ   r[   r\   s
             r+   #test_written_file_contains_markdownz=TestObsidianReporterWrite.test_written_file_contains_markdownq   s	   JJ<~~hDq"4E4E~FF..'.22&|w&&&&&&&&&&|w&&&&&|&&&&&&&&&&&w&&&&&w&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r-   c                    |dz  dz  dz  }t          |          }|                    g t          ddd                    }|j        } |            }|sd	d
t	          j                    v st          j        |          rt          j        |          nd
t          j        |          t          j        |          dz  }t          t          j
        |                    d x}}d S )Nabcr0   r6   r7   r8   r9   r   r   r   )r   r   r   r   rC   rD   rE   rF   rG   rH   rI   )rJ   r.   deep_dirr2   r   r}   rL   rM   s           r+   "test_creates_output_dir_if_missingz<TestObsidianReporterWrite.test_creates_output_dir_if_missingw   s    c>C'#-#x888~~bd4B.?.?~@@{{{}}}tt{}r-   )r   r   r   r   r   r   r   r   r)   r-   r+   r   r   i   s        ,7G ,SW ,\` , , , ,'<L 'X\ 'ae ' ' ' '4 D      r-   r   )__doc__builtinsrC   _pytest.assertion.rewrite	assertionrewriterE   r   r   r   pathlibr   pytest#ai_usecases_explorer.models.usecaser   r   r	   'ai_usecases_explorer.reporters.obsidianr   rt   r   r=   boollistr,   fixturer2   r4   r   r)   r-   r+   <module>r      s   4 4               ( ( ( ( ( ( ( ( ( (        N N N N N N N N N N D D D D D D  {)9") $   	
  9t  
      D 1t 1 0 1 1 1 14< 4< 4< 4< 4< 4< 4< 4<n         r-   