
    i                         d Z ddlZddlmc mZ ddlZddlm	Z	mZ ddl
Z
ddlmZmZmZmZ  G d d          Z G d d          Z G d	 d
          Z G d d          ZdS )z"Tests for UseCase Pydantic models.    N)UTCdatetime)NoveltyScenarioTypeUseCasemake_idc                   .    e Zd ZddZddZddZddZdS )
TestMakeIdreturnNc                    t          d          }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
 |D             }t          |          }|sddt	          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          dz  }	t          t          j	        |	                    d x}}d S )Nzhttps://example.com/post/123   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenresult)py0py1py3py6assert %(py8)spy8c              3      K   | ]}|d v V  	dS )0123456789abcdefN ).0cs     8/root/projects/ai_usecases_explorer/tests/test_models.py	<genexpr>z6TestMakeId.test_returns_12_char_hex.<locals>.<genexpr>   s(      ;;q1**;;;;;;    z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)r   py2py4)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr    )
selfr   @py_assert2@py_assert5@py_assert4@py_format7@py_format9@py_assert1@py_assert3@py_format5s
             r   test_returns_12_char_hexz#TestMakeId.test_returns_12_char_hex   s   7886{{ b {b          {b            s     s             6     6      {    b                           ;;F;;;;s;;;;;;;;;;;;;;;;s;;;;;s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r   c           	      T   d}t          |          }t          |          }||k    }|sxt          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        |          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        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )	Nz*https://news.ycombinator.com/item?id=12345r   )zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   url)r   r   r   py5r   r   zassert %(py10)spy10	r   r#   r$   r%   r&   r'   r(   r)   r*   )r+   r6   r,   @py_assert7r.   r0   @py_format11s          r   test_deterministiczTestMakeId.test_deterministic   s   :s||+ws||+||++++++++++||++++++++++++w+++++w+++++++++++++s+++++s++++++|+++++++++++w+++++w+++++++++++++s+++++s++++++|+++++++++++++++++++++++++++++r   c           	         d}t          |          }d}t          |          }||k    }|s"t          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        t                     rt          j        t                     ndt          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}}d S )	Nzhttps://example.com/azhttps://example.com/b)!=)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} != %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r   )r   r!   r"   r   r   r8   zassert %(py12)spy12r9   )r+   r1   r2   r:   @py_assert9r-   r;   @py_format13s           r   !test_different_urls_different_idsz,TestMakeId.test_different_urls_different_ids   sj   .Sw.//S;RS7;R3S3SS/3SSSSSSSSSSS/3SSSSSSSSSSSSSwSSSSSwSSSSSS.SSSS/SSSSSSSSSSS7SSSSS7SSSSSS;RSSSS3SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSr   c                    d}t          j        |                                                                          d d         }t	          |          }||k    }|st          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
        |          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 )Nzhttps://example.comr   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr   r6   expected)r   r   r   r7   assert %(py7)spy7)hashlibsha256encode	hexdigestr   r#   r$   r%   r&   r'   r(   r)   r*   )r+   r6   rD   r,   r.   @py_format6@py_format8s          r   test_matches_sha256_prefixz%TestMakeId.test_matches_sha256_prefix   su   #>#**,,//99;;CRC@s||'|x''''''''''|x''''''''''''w'''''w'''''''''''''s'''''s''''''|'''''''''''x'''''x'''''''''''''''''''''''''''''r   r   N)__name__
__module____qualname__r4   r<   rB   rM   r   r   r   r
   r
      sh        < < < <
, , , ,T T T T( ( ( ( ( (r   r
   c                   &    e Zd ZddZddZddZdS )TestScenarioTyper   Nc           	         t           D ]A}|j        }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t          j        |          dt	          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }t          t          j
        |                    d x}}Cd S )NzPassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.value
}, %(py4)s)
}
isinstancememberstrr   r   r   r"   r   )r   valuerU   rW   r%   r&   r#   r'   r(   r)   r*   )r+   rV   r,   r-   r/   s        r   #test_all_values_are_chinese_stringsz4TestScenarioType.test_all_values_are_chinese_strings#   s<   " 	1 	1F$l0:lC000000000000000:00000:0000000000000f00000f000000l00000000000C00000C000000000000000000000000000	1 	1r   c                 @   d t           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	}||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 )Nc                     h | ]	}|j         
S r   )name)r   ms     r   	<setcomp>z=TestScenarioType.test_has_expected_members.<locals>.<setcomp>(   s    ...A...r   LOCAL_DATA_INTEGRATION)in)z%(py1)s in %(py3)snames)r   r   zassert %(py5)sr7   CODE_GEN_REVIEWWORKFLOW_AUTOMATIONOTHER)	r   r#   r$   r(   r%   r&   r'   r)   r*   )r+   rb   @py_assert0r,   @py_format4rK   s         r   test_has_expected_membersz*TestScenarioType.test_has_expected_members'   s,   .....'0'50000000000'500000'000000000005000005000000000000000000000000000 ) E)))))))))) E))))) )))))))))))E)))))E)))))))))))))))))))))))))))$-$----------$-----$-------------------------------------------w%w%w%%r   c                    t           j        }d}||k    }|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z  }dd|iz  }t          t          j	        |                    d x}x}}d S )Nu   其他r   )z-%(py2)s
{%(py2)s = %(py0)s.OTHER
} == %(py5)sr   r   r!   r7   rE   rF   )
r   re   r#   r$   r%   r&   r'   r(   r)   r*   r+   r1   r.   r2   rK   rL   s         r   test_other_fallbackz$TestScenarioType.test_other_fallback.   s    !-X-!X----------!X------------|-----|------!----X-----------------------------r   rN   )rO   rP   rQ   rZ   rh   rl   r   r   r   rS   rS   "   sP        1 1 1 1       . . . . . .r   rS   c                       e Zd ZddZdS )TestNoveltyr   Nc                    t           j        }d}||k    }|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z  }dd|iz  }t          t          j	        |                    d x}x}}t           j
        }d}||k    }|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z  }dd|iz  }t          t          j	        |                    d x}x}}t           j        }d
}||k    }|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z  }dd|iz  }t          t          j	        |                    d x}x}}d S )Nnewr   )z+%(py2)s
{%(py2)s = %(py0)s.NEW
} == %(py5)sr   rj   rE   rF   similar)z/%(py2)s
{%(py2)s = %(py0)s.SIMILAR
} == %(py5)srepeat)z.%(py2)s
{%(py2)s = %(py0)s.REPEAT
} == %(py5)s)r   NEWr#   r$   r%   r&   r'   r(   r)   r*   SIMILARREPEATrk   s         r   test_valueszTestNovelty.test_values3   s   {#e#{e##########{e############w#####w######{####e###########################+)+)++++++++++)++++++++++++w+++++w++++++++++)+++++++++++++++++++++++++++~))~))))))))))~))))))))))))w)))))w))))))~)))))))))))))))))))))))))))))))))r   rN   )rO   rP   rQ   rv   r   r   r   rn   rn   2   s(        * * * * * *r   rn   c                   j    e Zd ZdefdZddZddZddZddZddZ	dd	Z
dd
ZddZddZddZdS )TestUseCaser   c                     t          j        t                    }i dddddddd	d
dddd|d|dt          j        dg ddddddddddt
          j        dg ddS )N)tzidabc123def456title&Using Claude to analyse local CSV datasummaryzCUser connects Claude Code to local CSVs. Avoids manual Excel steps.
source_urlz*https://reddit.com/r/ClaudeAI/comments/xyzsource_platformredditauthoruser123published_atcollected_atscenario_type
tools_used)zClaude CodePythonpandashas_local_dataThas_workflow_optvalue_score333333?is_real_valuenoveltysimilar_to_idsraw_contentzOriginal post content here...)r   nowr   r   r`   r   rs   )r+   r   s     r   _valid_payloadzTestUseCase._valid_payload:   s    lc"""
.
=
 \
 F	

 x
 i
 C
 C
 \@
 ===
 d
 
 4
 T
 w{
  b!
" :#
 	
r   Nc                    t          di |                                 }|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}}|j        }d}||u }|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}}|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 )Nr~   r   )z-%(py2)s
{%(py2)s = %(py0)s.title
} == %(py5)sucrj   rE   rF   T)is)z6%(py2)s
{%(py2)s = %(py0)s.has_local_data
} is %(py5)sr   )z3%(py2)s
{%(py2)s = %(py0)s.value_score
} == %(py5)sr   )r   r   r}   r#   r$   r%   r&   r'   r(   r)   r*   r   r   )r+   r   r1   r.   r2   rK   rL   s          r   'test_valid_usecase_creates_successfullyz3TestUseCase.test_valid_usecase_creates_successfullyP   s   --t**,,--xCCCxCCCCCCCCCCCxCCCCCCCCCCCCCrCCCCCrCCCCCCxCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC (D( D(((((((((( D((((((((((((r(((((r(((((( ((((D(((((((((((((((((((((((((((~%%~%%%%%%%%%%~%%%%%%%%%%%%r%%%%%r%%%%%%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%r   c                     |                                  }d|d<   t          j        t                    5  t	          di | d d d            d S # 1 swxY w Y   d S )Ng      ?r   r   r   pytestraises	Exceptionr   r+   payloads     r   test_value_score_clamped_to_0_1z+TestUseCase.test_value_score_clamped_to_0_1V   s    %%''!$]9%% 	 	g	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   AAAc                     |                                  }d|d<   t          j        t                    5  t	          di | d d d            d S # 1 swxY w Y   d S )Ngr   r   r   r   s     r   $test_value_score_below_zero_rejectedz0TestUseCase.test_value_score_below_zero_rejected\   s    %%''!%]9%% 	 	g	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r   c                    |                                  }d|d<   t          d	i |}|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 )
N
hackernewsr   r   )z7%(py2)s
{%(py2)s = %(py0)s.source_platform
} == %(py5)sr   rj   rE   rF   r   )r   r   r   r#   r$   r%   r&   r'   r(   r)   r*   r+   r   r   r1   r.   r2   rK   rL   s           r   test_source_platform_hackernewsz+TestUseCase.test_source_platform_hackernewsb   s   %%''%1!"w!1\1!\1111111111!\111111111111r11111r111111!1111\11111111111111111111111111111r   c                    t          di |                                 }|j        }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t          j	        |          dt          j                    v st          j        t                    rt          j	        t                    ndt          j	        |          dz  }t          t          j        |                    d x}}d S )NzUassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.tools_used
}, %(py4)s)
}rU   r   listrX   r   )r   r   r   rU   r   r%   r&   r#   r'   r(   r)   r*   )r+   r   r,   r-   r/   s        r   test_tools_used_is_listz#TestUseCase.test_tools_used_is_listh   sE   --t**,,---.z-...............z.....z............."....."......-............................................r   c                    |                                  }g |d<   t          di |}|j        }g }||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 )	Nr   r   )z6%(py2)s
{%(py2)s = %(py0)s.similar_to_ids
} == %(py5)sr   rj   rE   rF   r   )r   r   r   r#   r$   r%   r&   r'   r(   r)   r*   r   s           r   "test_similar_to_ids_defaults_emptyz.TestUseCase.test_similar_to_ids_defaults_emptyl   s   %%''$& !w &B& B&&&&&&&&&& B&&&&&&&&&&&&r&&&&&r&&&&&& &&&&B&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r   c                 h   t          di |                                 }|j        }t          j        }||k    }|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	        t                    rt          j
        t                    ndt          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )	Nr   za%(py2)s
{%(py2)s = %(py0)s.scenario_type
} == %(py6)s
{%(py6)s = %(py4)s.LOCAL_DATA_INTEGRATION
}r   r   r   r!   r"   r   r   r   r   )r   r   r   r   r`   r#   r$   r%   r&   r'   r(   r)   r*   )r+   r   r1   r-   r2   r/   r0   s          r   test_scenario_type_accepts_enumz+TestUseCase.test_scenario_type_accepts_enumr   sH   --t**,,--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FrFFFFFr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Fr   c                 v   |                                  }d|d<   t          d
i |}|j        }t          j        }||k    }|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	        t                    rt          j
        t                    ndt          j
        |          dz  }dd	|iz  }t          t          j        |                    d x}x}}d S )Nu   本地数据集成r   r   r   r   r   r   r   r   r   )r   r   r   r   r`   r#   r$   r%   r&   r'   r(   r)   r*   r+   r   r   r1   r-   r2   r/   r0   s           r   'test_scenario_type_accepts_string_valuez3TestUseCase.test_scenario_type_accepts_string_valuev   sW   %%''#7 w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FrFFFFFr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Fr   c                 v   |                                  }d|d<   t          d
i |}|j        }t          j        }||k    }|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	        t                    rt          j
        t                    ndt          j
        |          dz  }dd	|iz  }t          t          j        |                    d x}x}}d S )Nrp   r   r   )zH%(py2)s
{%(py2)s = %(py0)s.novelty
} == %(py6)s
{%(py6)s = %(py4)s.NEW
}r   r   r   r   r   r   )r   r   r   r   rs   r#   r$   r%   r&   r'   r(   r)   r*   r   s           r   !test_novelty_accepts_string_valuez-TestUseCase.test_novelty_accepts_string_value|   sO   %%''"	wz(W[(z[((((((((((z[((((((((((((r(((((r((((((z(((((((((((W(((((W(((((([(((((((((((((((((((((((((((((r   c                 z   t          d
i |                                 }|                                }|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	}||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 )Nr{   r|   r   )z%(py1)s == %(py4)s)r   r"   zassert %(py6)sr   r   rp   r   )r   r   
model_dumpr#   r$   r(   r)   r*   )r+   r   drf   r2   r,   r3   r/   s           r   test_serialises_to_dictz#TestUseCase.test_serialises_to_dict   s~   --t**,,--MMOOw(.(w.((((((((((w.(((((w((((.(((((((((((((((((((((((((((|$u$|u$$$$$$$$$$|u$$$$$|$$$$u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r   rN   )rO   rP   rQ   dictr   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   rx   9   s        
 
 
 
 
,& & & &      2 2 2 2/ / / /' ' ' 'G G G GG G G G) ) ) )% % % % % %r   rx   )__doc__builtinsr%   _pytest.assertion.rewrite	assertionrewriter#   rG   r   r   r   #ai_usecases_explorer.models.usecaser   r   r   r   r
   rS   rn   rx   r   r   r   <module>r      s?   ( (               " " " " " " " "            ( ( ( ( ( ( ( (&. . . . . . . . * * * * * * * *M% M% M% M% M% M% M% M% M% M%r   