
    i              	          d Z ddlZddlmc mZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ ddededefdZdej        dfdedededefdZ G d d          Z G d d          Z G d d          ZdS )zETests for LLM processing pipeline (filter, classifier, deduplicator).    N)UTCdatetime)	MagicMockpatch)RawItem)NoveltyScenarioTypeUseCase)
Classifier)Deduplicator)ValueFilterTestSome contenttitletextreturnc           
      f    t          | dddt          j        t                    |  d|           S )Nhttps://example.com/post
hackernewsusertzz

)r   
source_urlsource_platformauthorpublished_atraw_content)r   r   nowr   )r   r   s     </root/projects/ai_usecases_explorer/tests/test_processors.py	_raw_itemr       sF    -$\S)))(($((       abc123def456zA test summary.idscenariosummaryc                     t          j        t                    }t          di d| ddd|dddd	d
dd|d|d|ddgdddddddddt          j        dg ddS )Nr   r#   r   r   r%   r   r   r   r   r   r   r   collected_atscenario_type
tools_usedClaudehas_local_dataFhas_workflow_optTvalue_scoregffffff?is_real_valuenoveltysimilar_to_idsr   raw )r   r   r   r
   r   NEW)r#   r$   r%   r   s       r   _usecaser4      s    
 ,#


C   2f  .-	
 % v S S h :: u  C d   r!" E# r!   c                   &    e Zd ZddZddZddZdS )TestValueFilterr   Nc                    ddddd}t          d|          5  t          t                                }|                    t	                                }d d d            n# 1 swxY w Y   |d         }d}||u }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}|d         }d}||u }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}d S )NTzUses local dataFr.   reasonr+   r,   <ai_usecases_explorer.processors.filter.ValueFilter._call_llmreturn_valueclientr.   isz%(py1)s is %(py4)spy1py4assert %(py6)spy6r+   
r   r   r   runr    
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation	selfapi_responsevfresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s	            r   %test_returns_true_for_high_value_itemz5TestValueFilter.test_returns_true_for_high_value_item7   s
   !'" %	
 
 Q`lmmm 	) 	)IKK000BVVIKK((F	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) o&.$.&$..........&$.....&....$...........................&'/4/'4//////////'4/////'////4/////////////////////////////   >A##A'*A'c                    ddddd}t          d|          5  t          t                                }|                    t	                                }d d d            n# 1 swxY w Y   |d         }d}||u }|slt          j        d|fd	||f          t          j        |          t          j        |          d
z  }dd|iz  }t          t          j	        |                    d x}x}}d S )NFz!Just asks ChatGPT-style questionsr8   r:   r;   r=   r.   r?   rA   rB   rE   rF   rG   rN   s	            r   %test_returns_false_for_low_value_itemz5TestValueFilter.test_returns_false_for_low_value_itemD   s`   "9# %	
 
 Q`lmmm 	) 	)IKK000BVVIKK((F	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) o&/%/&%//////////&%/////&////%/////////////////////////////rY   c                    ddddd}t          d|          5  t          t                                }|                    t	                                }d d d            n# 1 swxY w Y   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}||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}||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}||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 )NTokr8   r:   r;   r=   r.   in)z%(py1)s in %(py3)srR   )rC   py3zassert %(py5)spy5r+   r,   r9   )r   r   r   rH   r    rI   rJ   rK   @py_builtinslocals_should_repr_global_namerL   rM   )rO   rP   rQ   rR   rS   rU   @py_format4@py_format6s           r   test_result_has_required_keysz-TestValueFilter.test_result_has_required_keysP   s   !" $	
 
 Q`lmmm 	) 	)IKK000BVVIKK((F	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) (&((((((((((&((((((((((((((((&(((((&((((((((((((((((((((((((((()6))))))))))6))))))))))))))))6)))))6)))))))))))))))))))))))))))!+!V++++++++++!V+++++!+++++++++++V+++++V+++++++++++++++++++++++++++!x6!!!!!!!!!!x6!!!!!x!!!!!!!!!!!6!!!!!6!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rY   r   N)__name__
__module____qualname__rX   r[   rg   r2   r!   r   r6   r6   6   sP        0 0 0 0
0 
0 
0 
0" " " " " "r!   r6   c                   .    e Zd ZddZddZddZddZdS )TestClassifierr   Nc                    dddgddd}t          d|          5  t          t                      	          }|                    t	                                }d d d            n# 1 swxY w Y   |d
         }t
          j        }||k    }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t
                    rt          j	        t
                    ndt          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }d}	||	k    }|slt          j        d|fd||	f          t          j	        |          t          j	        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	d}|d         }	||	v }|slt          j        d|fd||	f          t          j	        |          t          j	        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	d S )Nu   代码生成与审查r*   zVS Codeg?z-User uses Claude to review PRs automatically.r(   r)   r-   r%   ?ai_usecases_explorer.processors.classifier.Classifier._call_llmr;   r=   r(   ==)z7%(py1)s == %(py5)s
{%(py5)s = %(py3)s.CODE_GEN_REVIEW
}r	   rC   r`   ra   assert %(py7)spy7r-   z%(py1)s == %(py4)srB   rE   rF   r)   r^   z%(py1)s in %(py4)s)r   r   r   rH   r    r	   CODE_GEN_REVIEWrI   rJ   rK   rb   rc   rd   rL   rM   )rO   rP   clfrR   rS   @py_assert4rU   rf   @py_format8rT   rV   rW   s               r   "test_returns_classification_resultz1TestClassifier.test_returns_classification_resulte   s   4#Y/F	
 
 Tcoppp 	* 	*IKK000CWWY[[))F	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* o&F,*FF&*FFFFFFFFFFF&*FFFFFF&FFFFFFFFFFF,FFFFF,FFFFFF*FFFFFFFFFFFFFFFFFFFFFFFFFFFFm$++$++++++++++$+++++$+++++++++++++++++++++++++++++++/6,//x///////////x//////x//////////////////////////////////s   >A%%A),A)c                    ddgddd}t          d|          5  t          t                                }|                    t	                                }d d d            n# 1 swxY w Y   |d	         }t
          j        }||k    }|st          j        d
|fd||f          t          j	        |          dt          j                    v st          j        t
                    rt          j	        t
                    ndt          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )Nu   工作流自动化n8ng333333?zAutomates daily tasks.ro   rp   r;   r=   r(   rq   )z;%(py1)s == %(py5)s
{%(py5)s = %(py3)s.WORKFLOW_AUTOMATION
}r	   rs   rt   ru   )r   r   r   rH   r    r	   WORKFLOW_AUTOMATIONrI   rJ   rK   rb   rc   rd   rL   rM   	rO   rP   ry   rR   rS   rz   rU   rf   r{   s	            r   &test_maps_string_to_scenario_type_enumz5TestClassifier.test_maps_string_to_scenario_type_enums   s   1 '/	
 
 Tcoppp 	* 	*IKK000CWWY[[))F	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* o&J,*JJ&*JJJJJJJJJJJ&*JJJJJJ&JJJJJJJJJJJ,JJJJJ,JJJJJJ*JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs   >A$$A(+A(c                    dg ddd}t          d|          5  t          t                                }|                    t	                                }d d d            n# 1 swxY w Y   |d         }t
          j        }||k    }|st          j        d	|fd
||f          t          j	        |          dt          j                    v st          j        t
                    rt          j	        t
                    ndt          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )Nu   未知类别g333333?zSomething unknown.ro   rp   r;   r=   r(   rq   )z-%(py1)s == %(py5)s
{%(py5)s = %(py3)s.OTHER
}r	   rs   rt   ru   )r   r   r   rH   r    r	   OTHERrI   rJ   rK   rb   rc   rd   rL   rM   r   s	            r   -test_falls_back_to_other_for_unknown_scenarioz<TestClassifier.test_falls_back_to_other_for_unknown_scenario   s   ++	
 
 Tcoppp 	* 	*IKK000CWWY[[))F	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* o&<,*<<&*<<<<<<<<<<<&*<<<<<<&<<<<<<<<<<<,<<<<<,<<<<<<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<rY   c                    dg ddd}t          d|          5  t          t                                }|                    t	                                }d d d            n# 1 swxY w Y   |d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}}d S )Nu   其他g?zA concise summary.ro   rp   r;   r=   r%   rq   rv   rB   rE   rF   )
r   r   r   rH   r    rI   rJ   rK   rL   rM   )	rO   rP   ry   rR   rS   rT   rU   rV   rW   s	            r   test_result_has_summaryz&TestClassifier.test_result_has_summary   sd   %+	
 
 Tcoppp 	* 	*IKK000CWWY[[))F	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* i 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8rY   rh   )ri   rj   rk   r|   r   r   r   r2   r!   r   rm   rm   d   sh        0 0 0 0
K 
K 
K 
K
= 
= 
= 
=
9 
9 
9 
9 
9 
9r!   rm   c                   .    e Zd ZddZddZddZddZdS )TestDeduplicatorr   Nc                    dg dd}t          d|          5  t          t                                }|                    t	                      g           }d d d            n# 1 swxY w Y   |d         }t
          j        }||k    }|st          j        d	|fd
||f          t          j	        |          dt          j                    v st          j        t
                    rt          j	        t
                    ndt          j	        |          dz  }dd|iz  }t          t          j        |                    d x}x}}|d         }g }	||	k    }|slt          j        d	|fd||	f          t          j	        |          t          j	        |	          dz  }
dd|
iz  }t          t          j        |                    d x}x}}	d S )NnewzFirst of this kind.r/   r0   novelty_reasonCai_usecases_explorer.processors.deduplicator.Deduplicator._call_llmr;   r=   existingr/   rq   z+%(py1)s == %(py5)s
{%(py5)s = %(py3)s.NEW
}r   rs   rt   ru   r0   rv   rB   rE   rF   )r   r   r   rH   r4   r   r3   rI   rJ   rK   rb   rc   rd   rL   rM   )rO   rP   deduprR   rS   rz   rU   rf   r{   rT   rV   rW   s               r   !test_returns_new_when_no_existingz2TestDeduplicator.test_returns_new_when_no_existing   sG    3
 

 Xgsttt 	8 	8 	444EYYxzzBY77F	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 i /GK/ K////////// K///// ///////////G/////G//////K///////////////////////////&'-2-'2----------'2-----'----2-----------------------------s   A A$$A(+A(c                    t          dd          g}ddgdd}t          d|          5  t          t                      	          }|                    t                      |
          }d d d            n# 1 swxY w Y   |d         }t
          j        }||k    }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t
                    rt          j	        t
                    ndt          j	        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}d}|d         }
||
v }|slt          j        d|fd||
f          t          j	        |          t          j	        |
          dz  }dd|iz  }t          t          j        |                    d x}x}}
d S )Nexisting001111zSame kind of PR review tool.r%   similarzSame category already seen.r   r   r;   r=   r   r/   rq   )z/%(py1)s == %(py5)s
{%(py5)s = %(py3)s.SIMILAR
}r   rs   rt   ru   r0   r^   rw   rB   rE   rF   )r4   r   r   r   rH   r   SIMILARrI   rJ   rK   rb   rc   rd   rL   rM   )rO   r   rP   r   rR   rS   rz   rU   rf   r{   rT   rV   rW   s                r   )test_returns_similar_when_matching_existsz:TestDeduplicator.test_returns_similar_when_matching_exists   sd   -7UVVVW /0;
 

 Xgsttt 	> 	> 	444EYYxzzHY==F	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> i 3GO3 O3333333333 O33333 33333333333G33333G333333O333333333333333333333333333;6*:#;;#;;;;;;;;;;;#;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   A A77A;>A;c                    t          dd          g}ddgdd}t          d|          5  t          t                      	          }|                    t                      |
          }d d d            n# 1 swxY w Y   |d         }t
          j        }||k    }|st          j        d|fd||f          t          j	        |          dt          j                    v st          j        t
                    rt          j	        t
                    ndt          j	        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}d S )Ndup00000001azIdentical content.r   repeatzExact duplicate.r   r   r;   r=   r   r/   rq   )z.%(py1)s == %(py5)s
{%(py5)s = %(py3)s.REPEAT
}r   rs   rt   ru   )r4   r   r   r   rH   r   REPEATrI   rJ   rK   rb   rc   rd   rL   rM   )
rO   r   rP   r   rR   rS   rz   rU   rf   r{   s
             r   !test_returns_repeat_for_duplicatez2TestDeduplicator.test_returns_repeat_for_duplicate   s   ^5IJJJK-.0
 

 Xgsttt 	> 	> 	444EYYxzzHY==F	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> i 2GN2 N2222222222 N22222 22222222222G22222G222222N22222222222222222222222222222r   c                 8   t          t                                }|                    t                      g           }|d         }t          j        }||k    }|st          j        d|fd||f          t          j        |          dt          j
                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }dd	|iz  }t          t          j        |                    d
x}x}}|d         }g }||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }	dd|	iz  }
t          t          j        |
                    d
x}x}}d
S )zCWhen existing list is empty, skip LLM call and return NEW directly.r=   r   r/   rq   r   r   rs   rt   ru   Nr0   rv   rB   rE   rF   )r   r   rH   r4   r   r3   rI   rJ   rK   rb   rc   rd   rL   rM   )rO   r   rR   rS   rz   rU   rf   r{   rT   rV   rW   s              r   test_skips_llm_when_no_existingz0TestDeduplicator.test_skips_llm_when_no_existing   s   IKK0008::33i /GK/ K////////// K///// ///////////G/////G//////K///////////////////////////&'-2-'2----------'2-----'----2-----------------------------r!   rh   )ri   rj   rk   r   r   r   r   r2   r!   r   r   r      sd        
. 
. 
. 
.< < < <
3 
3 
3 
3. . . . . .r!   r   )r   r   )__doc__builtinsrb   _pytest.assertion.rewrite	assertionrewriterI   r   r   unittest.mockr   r   $ai_usecases_explorer.collectors.baser   #ai_usecases_explorer.models.usecaser   r	   r
   *ai_usecases_explorer.processors.classifierr   ,ai_usecases_explorer.processors.deduplicatorr   &ai_usecases_explorer.processors.filterr   strr    rx   r4   r6   rm   r   r2   r!   r   <module>r      s   K K               " " " " " " " " * * * * * * * * 8 8 8 8 8 8 N N N N N N N N N N A A A A A A E E E E E E > > > > > > S  '     )9$   	   >'" '" '" '" '" '" '" '"\19 19 19 19 19 19 19 19p+. +. +. +. +. +. +. +. +. +.r!   