
    P1ie                     ^   d Z ddlZddlmZmZmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z  dd	l!m"Z" dd
l#m$Z$ ddl%m&Z'  e
       Z( G d de      Z) G d de      Z* G d de      Z+ G d de      Z, G d de      Z- G d de      Z.y)a  
Comprehensive test suite for multilingual AI analysis functionality.

This test suite covers:

1. **i18n Utility Tests** (TestI18nUtilities):
   - Normal cases: Translation retrieval, language validation, element translation
   - Edge cases: Missing translations, invalid language codes, empty values
   - Outlier cases: Unicode handling, special characters, extreme values

2. **Prompt Template Tests** (TestPromptTemplateLanguage):
   - Normal cases: Language-specific template retrieval, fallback logic
   - Edge cases: Missing templates, inactive templates, multiple languages
   - Outlier cases: Invalid language codes, template conflicts

3. **BaZi Analysis Language Tests** (TestBaziAnalysisLanguage):
   - Normal cases: Chinese and English analysis generation
   - Edge cases: Language fallback, missing translations
   - Outlier cases: Invalid language codes, mixed language content

4. **LiuYao Analysis Language Tests** (TestLiuYaoAnalysisLanguage):
   - Normal cases: Chinese and English analysis generation
   - Edge cases: Language fallback, missing translations
   - Outlier cases: Invalid language codes, mixed language content

5. **API Endpoint Tests** (TestAPILanguageSupport):
   - Normal cases: Language parameter in API requests
   - Edge cases: Missing language parameter, invalid language codes
   - Outlier cases: Language in query params vs body, case sensitivity

Total: Comprehensive coverage of multilingual AI analysis feature.
    N)Mockpatch	MagicMock)TestCaseClient)get_user_model)timezone)datetimedatetime)SUPPORTED_LANGUAGESDEFAULT_LANGUAGETRANSLATIONSELEMENT_TRANSLATIONget_translationtranslate_gendertranslate_elementget_text	none_text
error_textunknown_text	join_list
is_missingformat_luck_descriptionvalidate_languagenormalize_language)get_active_template)PromptTemplate)Personc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestI18nUtilitiesz>Test i18n utility functions - Normal, Edge, and Outlier cases.c                 T   | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d	       | j                  t        dd      d
       | j                  t        dd      d       y)z"Test normal translation retrieval.gender_malezh-hans   男gender_female   女element_wood   木enMaleFemaleWoodN)assertEqualr   selfs    E/home/cursorai/projects/iching/ai/tests/test_multilingual_analysis.pytest_get_translation_normalz-TestI18nUtilities.test_get_translation_normalK   s     		BEJ)DeLCUK 	=vF$?J>G    c                 T   | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d	       | j                  t        dd      d
       | j                  t        dd      d       y)z'Test gender translation - normal cases.Mr$   r%   Fr'   N	   不指定r*   r+   r,   Not SpecifiedNr.   r   r/   s    r1   test_translate_gender_normalz.TestI18nUtilities.test_translate_gender_normalW   s     	)#y95A)#y95A)#y9;G 	)#t4f=)#t4h?)#t4oFr3   c                 4   | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d	       | j                  t        d
d      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        d
d      d       y)z(Test element translation - normal cases.woodr$   r)   fireu   火earthu   土metalu   金wateru   水r*   r-   FireEarthMetalWaterNr.   r   r/   s    r1   test_translate_element_normalz/TestI18nUtilities.test_translate_element_normalc   s     	*69=uE*69=uE*7I>F*7I>F*7I>F 	*648&A*648&A*7D97C*7D97C*7D97Cr3   c                     | j                  t        d      d       | j                  t        d      d       | j                  t        d      t               | j                  t        d      t               y)z(Test language validation - normal cases.r$   r*   ZH-HANSENNr.   r   r   r/   s    r1   test_validate_language_normalz/TestI18nUtilities.test_validate_language_normals   s\    *95yA*40$7*957GH*402BCr3   c                     | j                  t        d      d       | j                  t        d      d       | j                  t        d      t               | j                  t        d      t               y)z+Test language normalization - normal cases.r$   r*   N )r.   r   r   r/   s    r1   test_normalize_language_normalz0TestI18nUtilities.test_normalize_language_normal{   s\    +I6	B+D148+D13CD+B/1ABr3   c                     | j                  t        g dd      d       | j                  t        dgd      d       | j                  t        g dd      d       | j                  t        dgd      d       y)z!Test list joining - normal cases.)abcr$   za, b, crQ   r*   Nr.   r   r/   s    r1   test_join_list_normalz'TestI18nUtilities.test_join_list_normal   sf     	?I>	JC5)4c: 	?D99EC5$/5r3   c                    t        dddddd      }| j                  d|       | j                  d|       | j                  d	|       t        dddddd
      }| j                  d|       | j                  d|       | j                  d|       y)z0Test luck description formatting - normal cases.   甲   子10-20   比肩   正财r$      甲子
Ages 10-20   十神r*   zTen GodsNr   assertInr0   results     r1   #test_format_luck_description_normalz5TestI18nUtilities.test_format_luck_description_normal   s     )w(T]^h'lF+h' )w(TXYh'lF+j&)r3   c                 @    t        dd      }| j                  |d       y)z.Test translation with missing key - edge case.nonexistent_keyr$   Nr   r.   ra   s     r1    test_get_translation_missing_keyz2TestI18nUtilities.test_get_translation_missing_key   s"     !!2I>!23r3   c                 @    t        dd      }| j                  |d       y)z3Test translation with invalid language - edge case.r#   invalid-langr%   Nrf   ra   s     r1   %test_get_translation_invalid_languagez7TestI18nUtilities.test_get_translation_invalid_language   s      !?'r3   c                     | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       y)z=Test gender translation with invalid gender code - edge case.Xr$   r8   r*   r9   NrN   r:   r/   s    r1   test_translate_gender_invalidz/TestI18nUtilities.test_translate_gender_invalid   sd     	)#y9;G)#t4oF)$	:KH)"i8+Fr3   c                     | j                  t        dd      d       | j                  t              5  t        dd       ddd       | j                  t        dd      d       y# 1 sw Y   &xY w)z:Test element translation with invalid element - edge case.invalidr$   NrN   )r.   r   assertRaisesAttributeErrorr/   s    r1   test_translate_element_invalidz0TestI18nUtilities.test_translate_element_invalid   s^     	*9i@)L ~.dI. / 	*2y92> /.s   A$$A-c                 :   | j                  t        d      t               | j                  t        d      t               | j                  t        d      t               | j                  t        d      t               | j                  t        d      t               y)z&Test language validation - edge cases.ro   zhenglishrN   NrK   r/   s    r1   test_validate_language_edgez-TestI18nUtilities.test_validate_language_edge   sw     	*957GH*402BC*957GH*2.0@A*402BCr3   c                     | j                  t        g d      d       | j                  t        g d      d       | j                  t        dd      d       y)z.Test list joining with empty list - edge case.r$      无r*   NoneNrT   r/   s    r1   test_join_list_emptyz&TestI18nUtilities.test_join_list_empty   sI     	2y1592t,f543U;r3   c                    | j                  t        dd             | j                  t        dd             | j                  t        dd             | j                  t        dd             | j                  t        dd             | j                  t        dd             | j                  t        dd             | j                  t        dd             y)z*Test missing value detection - edge cases.Nr$   r*   rN   rx   ry   test)
assertTruer   assertFalser/   s    r1   test_is_missing_edgez&TestI18nUtilities.test_is_missing_edge   s     	
434
4./ 	
2y12
2t,- 	
5)45
6401 	FI67FD12r3   c                     t        dddddd      }| j                  d|       | j                  d|       | j                  d|       t        dddd	d	d      }| j                  d|       | j                  d|       y)
z.Test luck description formatting - edge cases.rW   rX   rY   Nr$   r\   r]   r^   rN   )r   r`   assertNotInra   s     r1   !test_format_luck_description_edgez3TestI18nUtilities.test_format_luck_description_edge   sx     )wdIVh'lF+6* )wB	Rh'6*r3   c                 l    t        dd      }| j                  |d       | j                  |t               y)z5Test translation with Unicode content - outlier case.r#   r$   r%   N)r   r.   assertIsInstancestrra   s     r1   test_get_translation_unicodez.TestI18nUtilities.test_get_translation_unicode   s0     !	:'fc*r3   c                 ^    g d}|D ]$  }t        |d      }| j                  |t               & y)z:Test gender translation with special codes - outlier case.)mfMALEFEMALE120r$   N)r   r   r   )r0   special_codescoderb   s       r1   #test_translate_gender_special_codesz5TestI18nUtilities.test_translate_gender_special_codes   s0     D!D%dI6F!!&#. "r3   c                     | j                  t        dd      d       | j                  t        dd      d       | j                  t        dd      d       y)z9Test element translation case sensitivity - outlier case.WOODr$   r)   r-   r=   NrF   r/   s    r1   'test_translate_element_case_sensitivityz9TestI18nUtilities.test_translate_element_case_sensitivity   sL     	*69=uE*69=uE*69=uEr3   c                 :   | j                  t        d      t               | j                  t        d      t               | j                  t        d      t               | j                  t        d      t               | j                  t        d      t               y)z=Test language validation with case variations - outlier case.rI   Zh-Hanszzh-HANSEnrJ   NrK   r/   s    r1   &test_validate_language_case_variationsz8TestI18nUtilities.test_validate_language_case_variations  sw     	*957GH*957GH*957GH*402BC*402BCr3   c                 t    g d}t        |d      }| j                  |d       | j                  |t               y)z4Test list joining with Unicode items - outlier case.)u   测试   中文u   内容r$   u   测试, 中文, 内容N)r   r.   r   r   )r0   unicode_itemsrb   s      r1   test_join_list_unicode_itemsz.TestI18nUtilities.test_join_list_unicode_items  s4    6=)4!9:fc*r3   c                     t        dddddd      }| j                  d|       | j                  d|       | j                  d|       y)	z:Test luck description with Unicode content - outlier case.rW   rX   rY   rZ   r[   r$   r^   Nr_   ra   s     r1   $test_format_luck_description_unicodez6TestI18nUtilities.test_format_luck_description_unicode  sA    (w(T]^eV$eV$h'r3   c                 .   | j                  t        dd      t        dd             | j                  t        d      t        dd             | j                  t	        d      t        dd             | j                  t        d      t        dd             y)z(Test text getter aliases - normal cases.r#   r$   noneerrorunknownN)r.   r   r   r   r   r   r/   s    r1   test_get_text_aliasesz'TestI18nUtilities.test_get_text_aliases  sw     	-;_]\e=fg9-vy/QRI.0STi0/)Y2WXr3   N)__name__
__module____qualname____doc__r2   r;   rG   rL   rO   rU   rc   rg   rj   rm   rr   rv   rz   r   r   r   r   r   r   r   r   r    r3   r1   r!   r!   G   s}    H
H
GD DC6*4(G	?D<3$++/FD+(Yr3   r!   c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestPromptTemplateLanguagezHTest prompt template language support - Normal, Edge, and Outlier cases.c                     t         j                  j                  ddddd      | _        t         j                  j                  dddd	d      | _        t         j                  j                  dd
dd	d      | _        y)Set up test data.baziTest Template ZH   中文模板内容r$   activedivination_typenamecontentlanguagestatusTest Template ENEnglish template contentr*   zTest Template DraftDraft templatedraftN)r   objectscreatetemplate_zhtemplate_entemplate_draftr/   s    r1   setUpz TestPromptTemplateLanguage.setUp+  s     *1188"#( 9 
 *1188"#. 9 
 -44;;"&$ < 
r3   c                 \    t         j                  j                         j                          yClean up test data.N)r   r   alldeleter/   s    r1   tearDownz#TestPromptTemplateLanguage.tearDownD  s    ""$++-r3   c                     t        dd      }| j                  |d       t        dd      }| j                  |d       y)z7Test getting active template by language - normal case.r   r$   r   r   r*   r   Nr   r.   ra   s     r1   (test_get_active_template_language_normalzCTestPromptTemplateLanguage.test_get_active_template_language_normalI  s@     %Vi@!56 %Vd;!;<r3   c                 >    t        d      }| j                  |d       y)z:Test getting template with default language - normal case.r   r   Nr   ra   s     r1   )test_get_active_template_default_languagezDTestPromptTemplateLanguage.test_get_active_template_default_languageS  s     %V,!56r3   c                 v    | j                   j                          t        dd      }| j                  |d       y)zGTest getting template when language template doesn't exist - edge case.r   r*   r   r   N)r   r   r   r.   ra   s     r1   )test_get_active_template_missing_languagezDTestPromptTemplateLanguage.test_get_active_template_missing_languageZ  s5     	! %Vd;!56r3   c                 f    t        dd      }| j                  |d       | j                  |d       y)z7Test that draft templates are not returned - edge case.r   r*   r   r   r   N)r   r.   assertNotEqualra   s     r1   %test_get_active_template_draft_statusz@TestPromptTemplateLanguage.test_get_active_template_draft_statusc  s2     %Vd;!;<F$45r3   c                     t         j                  j                         j                  d       t	        dd      }| j                  |t        t        d      f       y)z0Test when no active templates exist - edge case.archived)r   r   r$   r   N)r   r   r   updater   r   r   typera   s     r1   ,test_get_active_template_no_active_templateszGTestPromptTemplateLanguage.test_get_active_template_no_active_templatesj  sK     	""$++:+> %Vi@fsDJ&78r3   c                     t         j                  j                  ddddd      }t        dd      }t        dd      }| j	                  |d	       | j	                  |d       y
)z<Test template retrieval with multiple languages - edge case.liuyaozLiuYao TemplatezLiuYao contentr$   r   r   r   r   r   N)r   r   r   r   r.   )r0   liuyao_templatebazi_resultliuyao_results       r1   +test_get_active_template_multiple_languageszFTestPromptTemplateLanguage.test_get_active_template_multiple_languagest  sj     )0077$"$ 8 
 *&9E+HyI&:;(89r3   c                 B    t        dd      }| j                  |d       y)z=Test template retrieval with invalid language - outlier case.r   ri   r   r   Nr   ra   s     r1   )test_get_active_template_invalid_languagezDTestPromptTemplateLanguage.test_get_active_template_invalid_language  s!     %VnE!56r3   c                 \    t        dd      }t        dd      }| j                  ||       y)z<Test template retrieval with case variations - outlier case.r   rI   r   r$   Nr   )r0   result1result2s      r1   )test_get_active_template_case_insensitivezDTestPromptTemplateLanguage.test_get_active_template_case_insensitive  s,     &fyA%fyA'*r3   c                     t         j                  j                  ddd      j                         }| j	                  |d       y)z9Test unique constraint on active templates - normal case.r   r$   r   )r   r   r      N)r   r   filtercountr.   )r0   active_counts     r1   *test_get_active_template_unique_constraintzETestPromptTemplateLanguage.test_get_active_template_unique_constraint  sF     &--44" 5 
 %'	 	
 	q)r3   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r1   r   r   (  s<    R
2.
=7769:&7+*r3   r   c                   t   e Zd ZdZd Zd Z ed       ed       ed      d                      Z ed       ed       ed      d                      Z ed      d	        Z	 ed       ed       ed      d
                      Z
 ed      d        Z ed       ed       ed      d                      Zy)TestBaziAnalysisLanguagezFTest BaZi analysis language support - Normal, Edge, and Outlier cases.c           	          t         j                  j                  ddd      | _        t        j                  j                  ddt        ddd      t        d	d
      | j                        | _        yr   
1234567890test@example.comtestpass123phoneemailpasswordTest Personr5     r      r   r   gender
birth_date
birth_time
created_byN)	Userr   create_useruser
BaziPersonr   r   r   personr/   s    r1   r   zTestBaziAnalysisLanguage.setUp  sg    LL,,$" - 
	
 !((//D!Q'B{yy 0 
r3   c                     t         j                  j                         j                          t        j                  j                         j                          yr   r   r   r   r   r   r/   s    r1   r   z!TestBaziAnalysisLanguage.tearDown  6     '')!!#r3   z!ai.utils.bazi.get_active_templatezai.utils.bazi.LLMServiceFactoryai.utils.config.get_ai_configc                 0   ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_         || j                  d	      }| j                  |       | j                  |d
   d       | j                  d|       y)z,Test BaZi analysis in Chinese - normal case.r   analyze_bazi   中文提示模板u"   {"analysis": "中文分析结果"}
test-modeltest-providerprovidermodelr$   r   r   bazi_analysisNai.utils.bazir  return_valuer   get_completionr  get_servicer   assertIsNotNoner.   r`   r0   mock_get_ai_configmock_factorymock_get_templater  mock_servicerb   s          r1   test_analyze_bazi_chinesez2TestBaziAnalysisLanguage.test_analyze_bazi_chinese  s    
 	/ *>& {3W##0)0<  -7FQ]*^' dkkI> 	V$
+Y7ov.r3   c                 0   ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_         || j                  d	      }| j                  |       | j                  |d
   d       | j                  d|       y)z,Test BaZi analysis in English - normal case.r   r  English prompt templatez'{"analysis": "English analysis result"}r	  r
  r  r*   r   r   r  Nr  r  s          r1   test_analyze_bazi_englishz2TestBaziAnalysisLanguage.test_analyze_bazi_english  s    
 	/ *C& {3\##0)0<  -7FQ]*^' dkkD9 	V$
+T2ov.r3   c                     ddl m} d|_         || j                  d      }| j	                  d|        || j                  d      }| j	                  d|       y)	z5Test BaZi prompt preparation with language parameter.r   prepare_bazi_promptzTemplate with {{name}}r$   r   r   r*   N)r  r   r  r   r`   )r0   mock_templater   	result_zh	result_ens        r1   !test_prepare_bazi_prompt_languagez:TestBaziAnalysisLanguage.test_prepare_bazi_prompt_language  sQ     	6 &>" (iH	mY/ (dC	mY/r3   c                    ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_         || j                  d	      }| j                  |       | j                  |d
   d       y)z6Test BaZi analysis with language fallback - edge case.r   r     中文模板u   {"analysis": "分析结果"}r	  r
  r  r*   r   r   N)
r  r  r  r   r  r  r  r   r  r.   r  s          r1   #test_analyze_bazi_language_fallbackz<TestBaziAnalysisLanguage.test_analyze_bazi_language_fallback  s    
 	/ *8& {3Q##0)0<  -7FQ]*^' dkkD9 	V$
+T2r3   c                 h    ddl m} d|_         || j                  d      }| j	                  |       y)z?Test BaZi prompt preparation with invalid language - edge case.r   r  Templatero   r   N)r  r   r  r   r  )r0   r  r   rb   s       r1   )test_prepare_bazi_prompt_invalid_languagezBTestBaziAnalysisLanguage.test_prepare_bazi_prompt_invalid_language  s0     	6)3& %T[[9EV$r3   c                    ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_        dD ]>  } || j                  |	      }| j                  |       | j                  |d
   ddg       @ y)zATest BaZi analysis with case-insensitive language - outlier case.r   r  r)  z{"analysis": "Result"}r	  r
  r  rJ   r   r*   rI   r   r$   r   r   r$   r*   N)
r  r  r  r   r  r  r  r   r  r`   )r0   r  r  r  r  r  langrb   s           r1   +test_analyze_bazi_case_insensitive_languagezDTestBaziAnalysisLanguage.test_analyze_bazi_case_insensitive_language  s    
 	/)3& {3K##0)0<  -7FQ]*^' HD!$++=F  (MM&,y$.?@	 Hr3   N)r   r   r   r   r   r   r   r  r  r$  r'  r*  r.  r   r3   r1   r   r     s   P
$ ./
,-
*+/ , . 0/( ./
,-
*+/ , . 0/( ./0 00  ./
,-
*+3 , . 03& ./% 0% ./
,-
*+A , . 0Ar3   r   c                   <   e Zd ZdZd Zd Z ed       ed       ed      d                      Z ed       ed       ed      d                      Z ed       ed       ed      d	                      Z	 ed       ed       ed      d
                      Z
y)TestLiuYaoAnalysisLanguagezHTest LiuYao analysis language support - Normal, Edge, and Outlier cases.c                     ddl m} t        j                  j	                  ddd      | _        |j                  j                  dt        j                         dd	dd
dd| j
                  	      | _        y)r   r   r   r   r   r   r   u   测试问题111r   r   	questionqdatey1y2y3y4y5y6r   N)	liuyao.modelsr   r   r   r   r   r   r	   nowr0   r   s     r1   r   z TestLiuYaoAnalysisLanguage.setUp9  sk    (LL,,$" - 
	
 nn++#,,. , 

r3   c                     ddl m} |j                  j                         j	                          t
        j                  j                         j	                          y)r   r   r2  N)r=  r   r   r   r   r   r?  s     r1   r   z#TestLiuYaoAnalysisLanguage.tearDownN  s7    (##%!!#r3   z.ai.utils.liuyao_analysis.prepare_liuyao_promptz*ai.utils.liuyao_analysis.LLMServiceFactoryr  c                 0   ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_         || j                  d	      }| j                  |       | j                  |d
   d       | j                  d|       y)z.Test LiuYao analysis in Chinese - normal case.r   analyze_liuyaor  u5   {"think": "思考", "analysis": "中文分析结果"}r	  r
  r  r$   r   r   liuyao_analysisNai.utils.liuyao_analysisrC  r  r   r  r  r  r   r  r.   r`   r0   r  r  mock_prepare_promptrC  r  rb   s          r1   test_analyze_liuyao_chinesez6TestLiuYaoAnalysisLanguage.test_analyze_liuyao_chineseU  s    
 	< ,@( {3j##0)0<  -7FQ]*^'  i@ 	V$
+Y7'0r3   c                 0   ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_         || j                  d	      }| j                  |       | j                  |d
   d       | j                  d|       y)z.Test LiuYao analysis in English - normal case.r   rB  r  z<{"think": "Thinking", "analysis": "English analysis result"}r	  r
  r  r*   r   r   rD  NrE  rG  s          r1   test_analyze_liuyao_englishz6TestLiuYaoAnalysisLanguage.test_analyze_liuyao_englishl  s    
 	< ,E( {3q##0)0<  -7FQ]*^'  d; 	V$
+T2'0r3   c                    ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_         || j                  d	      }| j                  |       | j                  |d
   d       y)z8Test LiuYao analysis with language fallback - edge case.r   rB  r&  u/   {"think": "思考", "analysis": "分析结果"}r	  r
  r  r*   r   r   N)
rF  rC  r  r   r  r  r  r   r  r.   rG  s          r1   %test_analyze_liuyao_language_fallbackz@TestLiuYaoAnalysisLanguage.test_analyze_liuyao_language_fallback  s    
 	< ,:( {3d##0)0<  -7FQ]*^'  d; 	V$
+T2r3   c                    ddl m} d|_        t               }d|j                  _        d|_        ||j                  _        ddd|_        dD ]>  } || j                  |	      }| j                  |       | j                  |d
   ddg       @ y)zCTest LiuYao analysis with case-insensitive language - outlier case.r   rB  r)  z+{"think": "Thinking", "analysis": "Result"}r	  r
  r  r,  r   r   r$   r*   N)
rF  rC  r  r   r  r  r  r   r  r`   )r0   r  r  rH  rC  r  r-  rb   s           r1   -test_analyze_liuyao_case_insensitive_languagezHTestLiuYaoAnalysisLanguage.test_analyze_liuyao_case_insensitive_language  s    
 	<+5( {3`##0)0<  -7FQ]*^' HD#DKK$?F  (MM&,y$.?@	 Hr3   N)r   r   r   r   r   r   r   rI  rK  rM  rO  r   r3   r1   r0  r0  6  s    R
*$ ;<
78
*+1 , 9 =1( ;<
78
*+1 , 9 =1* ;<
78
*+3 , 9 =3( ;<
78
*+A , 9 =Ar3   r0  c                       e Zd ZdZd Zd Z ed      d        Z ed      d        Z ed      d        Z	 ed      d	        Z
 ed      d
        Zy)TestAPILanguageSupportzETest API endpoint language support - Normal, Edge, and Outlier cases.c           	      J   t               | _        t        j                  j	                  ddd      | _        | j                  j                  | j
                         t        j                  j                  ddt        ddd      t        d	d
      | j
                        | _        yr   )r   clientr   r   r   r   force_loginr   r   r   r   r   r/   s    r1   r   zTestAPILanguageSupport.setUp  s    hLL,,$" - 
	
 			* !((//D!Q'B{yy 0 
r3   c                     t         j                  j                         j                          t        j                  j                         j                          yr   r  r/   s    r1   r   zTestAPILanguageSupport.tearDown  r  r3   zai.utils.bazi.analyze_bazic                 H   ddddd|_         | j                  j                  d| j                  j                   dddid	
      }| j                  |j                  ddg       |j                          |j                  d   }| j                  |j                  d      d       y)z=Test BaZi analysis API with language parameter - normal case.Test analysisr*   r
  r	  r  r   r  r  /api/bazi/bazi/
/analysis/r   application/jsondatacontent_type      r   N)r  rS  postr   idr`   status_codeassert_called_once	call_argsr.   getr0   mock_analyzeresponsecall_kwargss       r1   $test_bazi_analysis_api_with_languagez;TestAPILanguageSupport.test_bazi_analysis_api_with_language  s    
 -'!	%
! ;;##dkknn-Z8d#+ $ 
 	h**S#J7'')",,Q/4d;r3   z'ai.utils.liuyao_analysis.analyze_liuyaoc                    ddl m} |j                  j                  dt	        j
                         dddddd| j                  	      }dd	d
dd|_        | j                  j                  d|j                   ddd	id      }| j                  |j                  ddg       |j                          |j                  d   }| j                  |j!                  d      d	       y)z?Test LiuYao analysis API with language parameter - normal case.r   r2  zTest questionr3  r   r   r4  rW  r*   r
  r	  )rD  r   r  r  z/api/liuyao/rZ  r   r[  r\  r_  r`  r   N)r=  r   r   r   r	   r>  r   r  rS  ra  rb  r`   rc  rd  re  r.   rf  )r0   rh  r   
liuyao_objri  rj  s         r1   &test_liuyao_analysis_api_with_languagez=TestAPILanguageSupport.test_liuyao_analysis_api_with_language  s     	)^^**$,,. + 


  /'!	%
! ;;##:==/4d#+ $ 
 	h**S#J7'')",,Q/4d;r3   c                 $   ddddd|_         | j                  j                  d| j                  j                   di d	      }| j                  |j                  d
dg       |j                  d   }| j                  |j                  d      d       y)z>Test BaZi analysis API without language parameter - edge case.rW  r$   r
  r	  rX  rY  rZ  r[  r\  r_  r`  r   r   N)
r  rS  ra  r   rb  r`   rc  re  r.   rf  rg  s       r1   'test_bazi_analysis_api_default_languagez>TestAPILanguageSupport.test_bazi_analysis_api_default_language  s    
 -!'!	%
! ;;##dkknn-Z8+ $ 
 	h**S#J7",,Q/4i@r3   c                 ,   ddddd|_         | j                  j                  d| j                  j                   ddd	id
      }| j                  |j                  ddg       |j                  d   }| j                  |j                  d      ddg       y)z9Test BaZi analysis API with invalid language - edge case.rW  r$   r
  r	  rX  rY  rZ  r   ri   r[  r\  r_  r`  r   r*   N	r  rS  ra  r   rb  r`   rc  re  rf  rg  s       r1   'test_bazi_analysis_api_invalid_languagez>TestAPILanguageSupport.test_bazi_analysis_api_invalid_language)  s    
 -!'!	%
! ;;##dkknn-Z8n-+ $ 
 	h**S#J7",,Q/kooj1It3DEr3   c                 :   ddddd|_         dD ]  }| j                  j                  d| j                  j                   dd	|id
      }| j                  |j                  ddg       |j                  d   }| j                  |j                  d	      ddg        y)z;Test BaZi analysis API with case variations - outlier case.rW  r*   r
  r	  rX  )rJ   r   r*   rY  rZ  r   r[  r\  r_  r`  r   r$   Nrr  )r0   rh  r-  ri  rj  s        r1   0test_bazi_analysis_api_case_insensitive_languagezGTestAPILanguageSupport.test_bazi_analysis_api_case_insensitive_languageB  s    
 -'!	%
! 'D{{''!$++..!1< $'/ ( H
 MM(..c
;&003KMM+//*5	47HI 'r3   N)r   r   r   r   r   r   r   rk  rn  rp  rs  ru  r   r3   r1   rQ  rQ    s    O
&$ '(< )<0 45$< 6$<N '(A )A, '(F )F0 '(J )Jr3   rQ  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestMultilingualIntegrationz5Test integration scenarios for multilingual analysis.c           	         t         j                  j                  ddd      | _        t        j                  j                  ddt        ddd      t        d	d
      | j                        | _        t        j                  j                  ddddd      | _
        t        j                  j                  ddddd      | _        y)r   r   r   r   r   r   r5   r   r   r   r   r   r   r   u   中文模板: {{name}}r$   r   r   r   zEnglish template: {{name}}r*   N)r   r   r   r   r   r   r   r   r   r   r   r   r/   s    r1   r   z!TestMultilingualIntegration.setUpa  s    LL,,$" - 
	
 !((//D!Q'B{yy 0 
 *1188"#, 9 
 *1188"#0 9 
r3   c                    t         j                  j                         j                          t        j                  j                         j                          t
        j                  j                         j                          yr   )r   r   r   r   r   r   r/   s    r1   r   z$TestMultilingualIntegration.tearDown  sQ     '')""$++-!!#r3   c                     ddl m}  || j                  d      }| j                  d|       | j                  d|       y)z&Test end-to-end Chinese analysis flow.r   r  r$   r   r   r&  Nr  r   r   r`   r0   r   prompts      r1    test_end_to_end_chinese_analysisz<TestMultilingualIntegration.test_end_to_end_chinese_analysis  s5    5 %T[[9E 	mV,nf-r3   c                     ddl m}  || j                  d      }| j                  d|       | j                  d|       y)z&Test end-to-end English analysis flow.r   r  r*   r   r   zEnglish templateNr{  r|  s      r1    test_end_to_end_english_analysisz<TestMultilingualIntegration.test_end_to_end_english_analysis  s6    5 %T[[4@ 	mV,(&1r3   c                     ddl m}  || j                  d      } || j                  d      }| j                  ||       | j	                  d|       | j	                  d|       y)	z5Test that language is consistent throughout analysis.r   r  r$   r   r*   r   EnglishN)r  r   r   r   r`   )r0   r   	prompt_zh	prompt_ens       r1   test_language_consistencyz5TestMultilingualIntegration.test_language_consistency  sY    5 (iH	'dC	 	Iy1 	h	* 	i+r3   N)	r   r   r   r   r   r   r~  r  r  r   r3   r1   rw  rw  ^  s    ?
>$
.
2,r3   rw  )/r   jsonunittest.mockr   r   r   django.testr   r   django.contrib.authr   django.utilsr	   r
   r   r   ai.utils.i18nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ai.utilsr   	ai.modelsr   bazi.modelsr   r   r   r!   r   r   r0  rQ  rw  r   r3   r1   <module>r     s   B  0 0 ( . ! ) )    $ ) $ , ZY ZYBt* t*vLAx LAfxA xA~bJX bJRO,( O,r3   