
    P1i]M                         d Z ddlmZ ddlmZ ddlmZ ddlmZ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y)z
Comprehensive unit tests for AI analysis reporting model functionality.

Tests cover:
- Person model BaZi and Number analysis reporting
- LiuYao model analysis reporting
- Model validation and edge cases
- Report state transitions
    )TestCase)get_user_model)timezone)datetime)Person)liuyaoc                       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y)PersonReportingModelTestsz)Test Person model reporting functionalityc                 D   t         j                  j                  dddd      | _        t         j                  j                  ddddd	
      | _        t
        j                  j                  dt        ddd      t        dd      | j                  dddidddi      | _	        y)Set up test data13800138000test@example.comTestUserphoneemail
first_name	last_name13800138001zadmin@example.comAdminT)r   r   r   r   is_staffu   测试人员        r   	completedbazi_analysiszTest analysis contentnumber_analysiszTest number analysis)name
birth_date
birth_time
created_byanalysis_statusai_analysisnumber_analysis_statusnumber_ai_analysisN)
r   objectscreate_useruser
admin_userr   creater   r   personselfs    Z/home/cursorai/projects/iching/iching/tests/../../tests/ai_report/test_reporting_models.pysetUpzPersonReportingModelTests.setUp   s    LL,,$	 - 
	 ,,22% 3 
 nn++D!Q'B{yy'(*AB#. 13IJ , 	
    c                 V    | j                  | j                  j                                y)z1Test that completed BaZi analysis can be reportedN)
assertTruer-   can_report_bazi_analysisr.   s    r0   )test_can_report_bazi_analysis_normal_casezCPersonReportingModelTests.test_can_report_bazi_analysis_normal_case6   s    <<>?r2   c                 x    d| j                   _        | j                  | j                   j                                yz5Test that analysis without content cannot be reportedN)r-   r%   assertFalser5   r.   s    r0   )test_can_report_bazi_analysis_no_analysiszCPersonReportingModelTests.test_can_report_bazi_analysis_no_analysis:   s)    "&==?@r2   c                 x    d| j                   _        | j                  | j                   j                                y3Test that non-completed analysis cannot be reportedpendingN)r-   r$   r9   r5   r.   s    r0   +test_can_report_bazi_analysis_not_completedzEPersonReportingModelTests.test_can_report_bazi_analysis_not_completed?   s)    &/#==?@r2   c                 x    d| j                   _        | j                  | j                   j                                yz<Test that already reported analysis cannot be reported againTN)r-   bazi_analysis_reportedr9   r5   r.   s    r0   .test_can_report_bazi_analysis_already_reportedzHPersonReportingModelTests.test_can_report_bazi_analysis_already_reportedD   s)    -1*==?@r2   c                    | j                   j                  dd| j                        }| j                  |       | j                  | j                   j                         | j                  | j                   j                  d       | j                  | j                   j                  d       | j                  | j                   j                  d       | j                  | j                   j                         y)z'Test successful BaZi analysis reportinginappropriate_contentzTest report messagecategoryuser_messagereported_byr>   N)r-   report_bazi_analysisr*   r4   rB   assertEqualbazi_report_categorybazi_report_messagebazi_report_statusassertIsNotNonebazi_report_timestampr/   results     r0   !test_report_bazi_analysis_successz;PersonReportingModelTests.test_report_bazi_analysis_successI   s    11,.		 2 
 	::;99;RS88:OP77CT[[>>?r2   c                     | j                   j                  dd      }| j                  |       | j                  | j                   j                  d       y)zXTest reporting with invalid category (model accepts it, validation happens at API level)invalid_categoryTest messagerG   rH   N)r-   rJ   r4   rK   rL   rQ   s     r0   *test_report_bazi_analysis_invalid_categoryzDPersonReportingModelTests.test_report_bazi_analysis_invalid_categoryX   sJ    11'' 2 
 	99;MNr2   c                     d| j                   _        | j                   j                  dd      }| j                  |       yz/Test reporting when analysis cannot be reportedTrE   rV   rW   N)r-   rB   rJ   r9   rQ   s     r0   'test_report_bazi_analysis_cannot_reportzAPersonReportingModelTests.test_report_bazi_analysis_cannot_reporta   s=    -1*11,' 2 
 	 r2   c                     | j                   j                  dd| j                        }| j                  |       | j	                  | j                   j
                  d       y)z5Test reporting with empty message (should be allowed)technical_error rF   N)r-   rJ   r*   r4   rK   rM   rQ   s     r0   'test_report_bazi_analysis_empty_messagezAPersonReportingModelTests.test_report_bazi_analysis_empty_messagej   sP    11&		 2 
 	88"=r2   c                 z    d}| j                   j                  d|| j                        }| j                  |       y)z%Test reporting with very long message  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAotherrF   N)r-   rJ   r*   r4   )r/   long_messagerR   s      r0   &test_report_bazi_analysis_long_messagez@PersonReportingModelTests.test_report_bazi_analysis_long_messageu   s;    !11%		 2 
 	r2   c                 V    | j                  | j                  j                                y)z3Test that completed Number analysis can be reportedN)r4   r-   can_report_number_analysisr.   s    r0   +test_can_report_number_analysis_normal_casezEPersonReportingModelTests.test_can_report_number_analysis_normal_case   s    >>@Ar2   c                 x    d| j                   _        | j                  | j                   j                                yr8   )r-   r'   r9   rf   r.   s    r0   +test_can_report_number_analysis_no_analysiszEPersonReportingModelTests.test_can_report_number_analysis_no_analysis   s)    )-&??ABr2   c                 x    d| j                   _        | j                  | j                   j                                y)r=   errorN)r-   r&   r9   rf   r.   s    r0   -test_can_report_number_analysis_not_completedzGPersonReportingModelTests.test_can_report_number_analysis_not_completed   s)    -4*??ABr2   c                    | j                   j                  dd| j                        }| j                  |       | j                  | j                   j                         | j                  | j                   j                  d       | j                  | j                   j                  d       | j                  | j                   j                  d       y)z)Test successful Number analysis reportinginaccurate_analysiszNumber analysis is wrongrF   r>   N)	r-   report_number_analysisr*   r4   number_analysis_reportedrK   number_report_categorynumber_report_messagenumber_report_statusrQ   s     r0   #test_report_number_analysis_successz=PersonReportingModelTests.test_report_number_analysis_success   s    33*3		 4 
 	<<=;;=RS::<VW999Er2   c                    | j                   j                  dd       | 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                         y)z;Test that reset clears all BaZi analysis and reporting datarE   zTest reportrW   N)r-   rJ   reset_bazi_analysisassertIsNoner%   analysis_timestampr$   r9   rB   rL   rM   rP   rN   bazi_report_admin_notesbazi_report_resolved_bybazi_report_resolved_atr.   s    r0   (test_reset_bazi_analysis_clears_all_datazBPersonReportingModelTests.test_reset_bazi_analysis_clears_all_data   s=    	((,& 	) 	
 	'') 	$++112$++889$++556;;<$++::;$++99:$++;;<$++889$++==>$++==>$++==>r2   c                 .   | j                   j                  dd       | j                   j                          | j                  | j                   j                         | j                  | j                   j
                         | j                  | j                   j                         | j                  | j                   j                         | j                  | j                   j                         | j                  | j                   j                         y)z=Test that reset clears all Number analysis and reporting datar]   zSystem errorrW   N)r-   ro   reset_number_analysisrw   r'   number_analysis_timestampr&   r9   rp   rq   rr   r.   s    r0   *test_reset_number_analysis_clears_all_datazDPersonReportingModelTests.test_reset_number_analysis_clears_all_data   s     	**&' 	+ 	
 	))+ 	$++889$++??@$++<<===>$++<<=$++;;<r2   c                 T   | j                   j                  dd      }| j                  |       | j                   j                  dd      }| j                  |       | j	                  | j                   j
                  d       | j	                  | j                   j                  d       y)zDTest that multiple report attempts on same analysis fail after firstrE   zFirst reportrW   offensive_languagezSecond reportN)r-   rJ   r4   r9   rK   rL   rM   )r/   result1result2s      r0   test_multiple_report_attemptsz7PersonReportingModelTests.test_multiple_report_attempts   s     ++22,' 3 
 	  ++22)( 3 
 	! 	99;RS88.Ir2   c                     | j                   j                  ddd      }| j                  |       | j                  | j                   j                         y)zTest reporting with None valuesrb   NrF   )r-   rJ   r4   rw   rM   rQ   s     r0   test_report_with_none_valuesz6PersonReportingModelTests.test_report_with_none_values   sJ    11 2 
 	$++99:r2   c           	         g d}|D ]  }t         j                  j                  d| t        ddd      | j                  dddi      }|j                  |	      }| j                  |       | j                  |j                  |        y
)z/Test that report category choices are validated)rE   rn   r   r]   rb   zTest r   r   r   testdatar    r!   r#   r$   r%   rG   N)	r   r(   r,   r   r*   rJ   r4   rK   rL   )r/   valid_categoriesrG   r-   rR   s        r0   test_choice_field_validationz6PersonReportingModelTests.test_choice_field_validation   s    L )H^^**XJ'a+99 +#V, + F 00(0CFOOF#V88(C )r2   N)__name__
__module____qualname____doc__r1   r6   r:   r?   rC   rS   rX   r[   r_   rd   rg   ri   rl   rt   r|   r   r   r   r    r2   r0   r   r      sp    3
<@A
A
A
@O!	>	 BC
C
F ?0=*J(	;Dr2   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)LiuYaoReportingModelTestsz)Test LiuYao model reporting functionalityc                     t         j                  j                  dddd      | _        t        j                  j                  d| j                  t        j                         ddddddd	d
di      | _        y)r   r   r   r   r   r   zTest question for divination10r   responsezTest LiuYao analysis contentquestionr*   qdatey1y2y3y4y5y6r$   r%   N)	r   r(   r)   r*   r	   r,   r   nowliuyao_entryr.   s    r0   r1   zLiuYaoReportingModelTests.setUp  ss    LL,,$	 - 
	 #NN113,,.sssss'#%CD 2 
r2   c                 V    | j                  | j                  j                                y)z3Test that completed LiuYao analysis can be reportedN)r4   r   can_report_analysisr.   s    r0   $test_can_report_analysis_normal_casez>LiuYaoReportingModelTests.test_can_report_analysis_normal_case  s    ))==?@r2   c                 x    d| j                   _        | j                  | j                   j                                yr8   )r   r%   r9   r   r.   s    r0   $test_can_report_analysis_no_analysisz>LiuYaoReportingModelTests.test_can_report_analysis_no_analysis  s-    (,%**>>@Ar2   c                 x    d| j                   _        | j                  | j                   j                                yr<   )r   r$   r9   r   r.   s    r0   &test_can_report_analysis_not_completedz@LiuYaoReportingModelTests.test_can_report_analysis_not_completed  s-    ,5)**>>@Ar2   c                 x    d| j                   _        | j                  | j                   j                                yrA   )r   analysis_reportedr9   r   r.   s    r0   )test_can_report_analysis_already_reportedzCLiuYaoReportingModelTests.test_can_report_analysis_already_reported$  s-    .2+**>>@Ar2   c                    | j                   j                  dd| j                        }| j                  |       | j                  | j                   j                         | j                  | j                   j                  d       | j                  | j                   j                  d       | j                  | j                   j                  d       | j                  | j                   j                         y)z)Test successful LiuYao analysis reportingrn   z(The hexagram interpretation is incorrectrF   r>   N)r   report_analysisr*   r4   r   rK   report_categoryreport_messagereport_statusrO   report_timestamprQ   s     r0   test_report_analysis_successz6LiuYaoReportingModelTests.test_report_analysis_success)  s    ""22*C		 3 
 	));;<**::<QR**99;ef**88)DT..??@r2   c                     d| j                   _        | j                   j                  dd      }| j                  |       yrZ   )r   r   r   r9   rQ   s     r0   "test_report_analysis_cannot_reportz<LiuYaoReportingModelTests.test_report_analysis_cannot_report8  sA    .2+""22,' 3 
 	 r2   c                    | j                   j                  dd       | 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                         y)z=Test that reset clears all LiuYao analysis and reporting datar   zOffensive contentrW   N)r   r   reset_analysisrw   r%   rx   r$   r9   r   r   r   r   r   report_admin_notesreport_resolved_byreport_resolved_atr.   s    r0   #test_reset_analysis_clears_all_dataz=LiuYaoReportingModelTests.test_reset_analysis_clears_all_dataA  sW    	))), 	* 	
 	((* 	$++778$++>>?$++;;<**<<=$++;;<$++::;$++<<=$++99:$++>>?$++>>?$++>>?r2   c                     d}| j                   j                  d|      }| j                  |       | j                  | j                   j                  |       y)z1Test reporting with special characters in messageuB   This contains 特殊字符 and émojis 🤔 and symbols !@#$%^&*()rb   rW   N)r   r   r4   rK   r   )r/   special_messagerR   s      r0   #test_report_with_special_charactersz=LiuYaoReportingModelTests.test_report_with_special_characters[  sR    ^""22( 3 

 	**99?Kr2   c                     d| j                   _        | j                   j                  dd      }| j                  |       y)z5Test reporting analysis for entry with empty questionr^   r]   zEmpty question issuerW   N)r   r   r   r4   rQ   s     r0   test_report_with_empty_questionz9LiuYaoReportingModelTests.test_report_with_empty_questionf  s?    %'"""22&/ 3 

 	r2   c                    t         j                  j                  d| j                  t	        j
                         dddddddddi      }| j                  j                  d	      }|j                  d
	      }| j                  |       | j                  |       | j                  | j                  j                         | j                  |j                         y)zATest that same user can report multiple different LiuYao analyseszSecond questionr   r   r   r   zSecond analysisr   rE   r   rn   N)
r	   r(   r,   r*   r   r   r   r   r4   r   )r/   liuyao2r   r   s       r0   &test_multiple_liuyao_reports_same_userz@LiuYaoReportingModelTests.test_multiple_liuyao_reports_same_userp  s     ..''&,,.sssss'#%67 ( 
 ##33=T3U))3H)I  ));;<112r2   N)r   r   r   r   r1   r   r   r   r   r   r   r   r   r   r   r   r2   r0   r   r     sC    3
$AB
B
B
A!@4	L 3r2   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
ModelReportingEdgeCaseTestsz:Test edge cases and outlier scenarios for reporting modelsc                 P    t         j                  j                  dd      | _        y)zSet up test data for edge casesr   r   )r   r   N)r   r(   r)   r*   r.   s    r0   r1   z!ModelReportingEdgeCaseTests.setUp  s#    LL,,$ - 
	r2   c                     t         j                  j                  dt        ddd      ddddi      }|j	                  d	
      }| j                  |       y)z-Test Person reporting when created_by is NonezOrphan Personr   r   Nr   r   r   r   rb   r   )r   r(   r,   r   rJ   r4   r/   r-   rR   s      r0   test_person_without_userz4ModelReportingEdgeCaseTests.test_person_without_user  sY    && D!Q''( ' 
 ,,g,>r2   c                     t         j                  j                  ddt        j                         dddddddddi      }|j                  d	
      }| j                  |       y)z'Test LiuYao reporting when user is NonezGuest questionNr   r   r   r   zGuest analysisr   r]   r   )r	   r(   r,   r   r   r   r4   )r/   entryrR   s      r0   test_liuyao_without_userz4ModelReportingEdgeCaseTests.test_liuyao_without_user  se    %%%,,.sssss'#%56 & 
 &&0A&Br2   c                     t         j                  j                  dt        ddd      | j                  dddi      }d|_        |j                          |j                  d	
      }| j                  |       y)z>Test concurrent reporting attempts (race condition simulation)zConcurrent Testr   r   r   r   r   r   TrE   r   N)	r   r(   r,   r   r*   rB   saverJ   r9   r   s      r0   test_concurrent_report_attemptsz;ModelReportingEdgeCaseTests.test_concurrent_report_attempts  ss    &&"D!Q'yy'( ' 
 )-% ,,6M,N r2   c           	          t         j                  j                  dt        ddd      | j                  dddd      }|j                  d	
      }| j                  |       y)z.Test reporting with malformed AI analysis datazMalformed Data Testr   r   r   	structurerequired_fields)invalidmissingr   r]   r   Nr   r(   r,   r   r*   rJ   r4   r   s      r0   test_malformed_analysis_dataz8ModelReportingEdgeCaseTests.test_malformed_analysis_data  s_    &&&D!Q'yy'$/<MN ' 
 ,,6G,Hr2   c                     t         j                  j                  dt        ddd      | j                  dddi      }d}|j                  d	|
      }| j                  |       | j                  |j                  |       y)z9Test handling of Unicode characters and emojis in reportsu   测试用户 👤r   r   r   r   u   数据 📊r   uJ   报告内容包含中文、English、🔥emojis🔥、和symbols!@#$%^&*()rb   rW   N)	r   r(   r,   r   r*   rJ   r4   rK   rM   )r/   r-   unicode_messagerR   s       r0   test_unicode_and_emoji_handlingz;ModelReportingEdgeCaseTests.test_unicode_and_emoji_handling  s    &&$D!Q'yy'/ ' 
 g,,( - 

 	33_Er2   c                 |   t         j                  j                  dt        ddd      | j                  dddi      }|j                  d	      }| j                  |       t         j                  j                  d
t        ddd      | j                  dddi      }|j                  d	      }| j                  |       y)z'Test reporting with extreme date valueszAncient Personil  r   r   r   zold datar   rn   r   zFuture Personi  r      zfuture datarb   Nr   )r/   
old_personrR   future_persons       r0   test_extreme_date_valuesz4ModelReportingEdgeCaseTests.test_extreme_date_values  s     ^^**!D!Q'yy', + 

 00:O0P -- D"b)yy'/ . 
 33W3Er2   N)r   r   r   r   r1   r   r   r   r   r   r   r   r2   r0   r   r     s)    D
  !$ F& r2   r   N)r   django.testr   django.contrib.authr   django.utilsr   datetimer   r   bazi.modelsr   liuyao.modelsr	   r   r   r   r   r   r2   r0   <module>r      sT    ! . !    iD iDXB3 B3Jp ( p r2   