
    P1ih                         d dl mZmZ d dlm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 d d	lmZmZmZmZ d d
lZ e       Z G d de      Zy
)    )TestCaseClient)reverse)get_user_model)liuyao)UserProfile)patch	MagicMock)status)timezone)datetimedatetime	timedeltaNc                      e Zd ZdZd Zd Zd Z ed      d        Z ed      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 ed      d        Zd Zd Zd Zd Zd Zd Z ed      d        Zd Z ed      d        Z ed      d        Zd Zd Zd Zd Z d Z!y )!LiuYaoAnalysisTestsz-Test suite for the LiuYao analysis endpoints.c                 ^   t         j                  j                  ddd      | _        t         j                  j                  ddd      | _        t         j                  j                  dddd	
      | _        d| j                  j                  _        | j                  j                  j                          d	| j                  j                  _        | j                  j                  j                          t        j                  j                  dt        j                         dddddd| j                  d
      | _        t        j                  j                  dt        j                         dddddd| j                  d
      | _        t        j                  j                  dt        j                         dddddd| j
                  d
      | _        t        j                  j                  dt        j                         dddddddd
      | _        t#               | _        ddddddd | _        | j&                  | j                  _        d!| j                  _        t        j                         | j                  _        | j                  j                          d"| _        d#| _        d#| _        y)$zSet up test data.
1234567890zregular@example.comtestpassword123)phoneemailpassword
2345678901zregen@example.com
3456789012zstaff@example.comT)r   r   r   is_staffF   测试问题 - 普通用户11101u   用户自己的解读
questionqdatey1y2y3y4y5y6userreadingu$   测试问题 - 可重新生成用户000 u   测试问题 - 管理员u   管理员的解读u   公开测试问题Nu   公开记录ui   这是一个测试分析结果。根据您的六爻卦象，您询问的事情将会有积极的发展。u9   思考过程：分析卦象的变化和六神的作用...test_provider
test_modelu   测试提示词内容u   详细的六爻分析内容)liuyao_analysisthinkprovidermodelpromptanalysis	completedz/api/liuyao/{}/analysis/z/api/liuyao/liuyao/{}/)Userobjectscreate_userregular_user
regen_user
staff_userprofilecan_regenerate_aisaver   creater   nowliuyao_regularliuyao_regenliuyao_staffliuyao_publicr   clientmock_analysis_dataai_analysisanalysis_statusanalysis_timestampanalysis_url_templatedetail_url_templatedelete_url_template)selfs    D/home/cursorai/projects/iching/api/tests/test_liuyao_analysis_api.pysetUpzLiuYaoAnalysisTests.setUp   su    !LL44'& 5 
 ,,22%& 3 
 ,,22%&	 3 
 7<!!3!!&&(481$$& %nn332,,.""+ 4 
 #NN11;,,. 2 
 #NN11/,,.( 2 
 $^^22),,." 3 
 h  KP'!-5#
 +/*A*A'.9+19.  " &@" $< #;     c                    | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       | j                  |j                  d   | j                         | j                  d|j                         y)	z6Test GET request to retrieve existing LiuYao analysis.r   r   r   r   r   r5   r4   	timestampN)rJ   formatrA   idrE   logingetassertEqualstatus_coder   HTTP_200_OKdatarF   assertInrM   urlresponses      rN   test_get_existing_analysisz.LiuYaoAnalysisTests.test_get_existing_analysis   s    ((//0C0C0F0FG7HI;;??3'--v/A/ABx0+>z2D4K4KLk8==1rP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       | j                  d|j                         y)z-Test GET request for LiuYao without analysis.r   r   rR   r   	not_foundmessageN)rJ   rT   rB   rU   rE   rV   rW   rX   rY   r   rZ   r[   r\   r]   s      rN   test_get_nonexistent_analysisz1LiuYaoAnalysisTests.test_get_nonexistent_analysis   s    ((//0A0A0D0DE7HI;;??3'--v/A/ABx0+>i/rP   'ai.utils.liuyao_analysis.analyze_liuyaoc                    | j                   j                  | j                  j                        }| j                  j                  dd       | j                  |_        | j                  j                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       | j                  |j                  d   | j                         |j                          y)z4Test POST request to generate a new LiuYao analysis.r   r   rR   r   r5   r4   N)rJ   rT   rB   rU   rE   rV   rF   return_valuepostrX   rY   r   rZ   r[   assert_called_oncerM   mock_analyzer^   r_   s       rN   test_post_generate_analysisz/LiuYaoAnalysisTests.test_post_generate_analysis   s     ((//0A0A0D0DE7HI %)$;$;!;;##C(--v/A/ABx0+>z2D4K4KL'')rP   c                 l   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  |_        | j                  j                  |dddd      }| j                  |j                  t        j                         |j                          |j                  \  }}| j                  |d	   | j                         | j                  d
|       | j                  d|       | j                  |d
   d       | j                  |d   d       y)z5Test POST request with provider and model parameters.r   r   rR   groqzllama-3.1-70b-versatile)r1   r2   application/jsonr[   content_typer   	model_keyr1   N)rJ   rT   rB   rU   rE   rV   rF   rg   rh   rX   rY   r   rZ   ri   	call_argsr\   )rM   rk   r^   r_   argskwargss         rN   $test_post_with_provider_model_paramsz8LiuYaoAnalysisTests.test_post_with_provider_model_params   s    ((//0A0A0D0DE7HI %)$;$;! ;;##$/HI+ $ 
 	--v/A/AB'')#--fa$"3"34k6*j&),.GH
+V4rP   c                 P   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       | j                  |j                  d   d       | j                  |j                  d   d	       | j                  d
|j                         | j                  d|j                         y)z,Test GET request to retrieve LiuYao details.r   r   rR   r!   r   r#   r   r$   r   r"   r*   N)rK   rT   rA   rU   rE   rV   rW   rX   rY   r   rZ   r[   r\   r]   s      rN   test_get_liuyao_detailz*LiuYaoAnalysisTests.test_get_liuyao_detail   s    &&--d.A.A.D.DE7HI;;??3'--v/A/ABz24QRt,e4t,c2gx}}-i/rP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  t        j                        5  t        j                  j                  | j                  j                         ddd       y# 1 sw Y   yxY w)z,Test DELETE request to remove LiuYao record.r   r   rR   )rU   N)rL   rT   rB   rU   rE   rV   deleterX   rY   r   HTTP_204_NO_CONTENTassertRaisesr   DoesNotExistr7   rW   r]   s      rN   test_delete_liuyao_recordz-LiuYaoAnalysisTests.test_delete_liuyao_record   s    &&--d.?.?.B.BC7HI;;%%c*--v/I/IJ v223NN$"3"3"6"67 433s   15C//C8c                 <   | j                   j                  d      }| j                  j                  dd       | j                  j	                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       y)z.Test request for a non-existent LiuYao record.i'  r   r   rR   errorzLiuYao divination not foundN)
rJ   rT   rE   rV   rW   rX   rY   r   HTTP_404_NOT_FOUNDr[   r]   s      rN   test_nonexistent_liuyaoz+LiuYaoAnalysisTests.test_nonexistent_liuyao   sx    ((//57HI;;??3'--v/H/HIw/1NOrP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       t        d      |_        | j                  j                  |      }| j                  |j                  t        j                         | j                  d|j                         | j                  d|j                         y)z-Test handling of analysis generation failure.r   r   rR   z!LiuYao analysis generation failedr   detailN)rJ   rT   rB   rU   rE   rV   	Exceptionside_effectrh   rX   rY   r   HTTP_500_INTERNAL_SERVER_ERRORr\   r[   rj   s       rN   test_analysis_failurez)LiuYaoAnalysisTests.test_analysis_failure   s     ((//0A0A0D0DE7HI $--P#Q ;;##C(--v/T/TUgx}}-h.rP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       d|_        | j                  j                  |      }| j                  |j                  t        j                         | j                  d|j                         | j                  |j                  d   d       | j                  d|j                         y)z2Test handling when analysis function returns None.r   r   rR   Nr   r   rc   rJ   rT   rB   rU   rE   rV   rg   rh   rX   rY   r   r   r\   r[   rj   s       rN   test_analysis_returns_nonez.LiuYaoAnalysisTests.test_analysis_returns_none   s     ((//0A0A0D0DE7HI %)!;;##C(--v/T/TUh.x0':i/rP   c                 X   | j                   j                  | j                  j                        }| j                  |_        | j                  j                  |ddid      }| j                  |j                  t        j                  t        j                  g       |j                          y)z1Test regeneration attempt without authentication.
regenerateTro   rp   N)rJ   rT   rA   rU   rF   rg   rE   rh   r\   rY   r   HTTP_403_FORBIDDENrZ   assert_not_calledrj   s       rN   &test_regenerate_without_authenticationz:LiuYaoAnalysisTests.test_regenerate_without_authentication  s     ((//0C0C0F0FG %)$;$;!;;##%+ $ 
 	h**V-F-FHZHZ,[\&&(rP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       | j                  |_        | j                  j                  |ddid      }| j                  |j                  t        j                         | j                  d|j                         |j                          y	)
zBTest regeneration attempt by user without regeneration permission.r   r   rR   r   Tro   rp   r   N)rJ   rT   rA   rU   rE   rV   rF   rg   rh   rX   rY   r   r   r\   r[   r   rj   s       rN   "test_regenerate_without_permissionz6LiuYaoAnalysisTests.test_regenerate_without_permission  s     ((//0C0C0F0FG7HI %)$;$;!;;##%+ $ 
 	--v/H/HIgx}}-&&(rP   c                 r   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  |_        | j                  j                  |ddid      }| j                  |j                  t        j                         |j                          y)	z*Test regeneration by user with permission.r   r   rR   r   Tro   rp   N)rJ   rT   rB   rU   rE   rV   rF   rg   rh   rX   rY   r   rZ   ri   rj   s       rN   test_regenerate_with_permissionz3LiuYaoAnalysisTests.test_regenerate_with_permission2       ((//0A0A0D0DE7HI %)$;$;!;;##%+ $ 
 	--v/A/AB'')rP   c                 r   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  |_        | j                  j                  |ddid      }| j                  |j                  t        j                         |j                          y)	zCTest regeneration by staff user (should override permission check).r   r   rR   r   Tro   rp   N)rJ   rT   rC   rU   rE   rV   rF   rg   rh   rX   rY   r   rZ   ri   rj   s       rN   test_regenerate_by_staffz,LiuYaoAnalysisTests.test_regenerate_by_staffD  r   rP   c                 &   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         y)z<Test user attempting to access another user's LiuYao record.r   r   rR   N)rK   rT   rC   rU   rE   rV   rW   rX   rY   r   r   r]   s      rN   &test_user_accessing_other_users_liuyaoz:LiuYaoAnalysisTests.test_user_accessing_other_users_liuyaoV  sj    &&--d.?.?.B.BC7HI;;??3'--v/H/HIrP   c                 F   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                  t        j                  g       y)z<Test user attempting to delete another user's LiuYao record.r   r   rR   N)rL   rT   rC   rU   rE   rV   rz   r\   rY   r   r   r   r]   s      rN   %test_user_deleting_other_users_liuyaoz9LiuYaoAnalysisTests.test_user_deleting_other_users_liuyao_  sw    &&--d.?.?.B.BC7HI;;%%c* 	h**V-F-FHaHa,bcrP   c                     | j                   j                  | j                  j                        }| j                  j                  |      }| j                  |j                  t        j                         y)z0Test anonymous access to a public LiuYao record.N)
rJ   rT   rD   rU   rE   rW   rX   rY   r   rZ   r]   s      rN   &test_anonymous_access_to_public_liuyaoz:LiuYaoAnalysisTests.test_anonymous_access_to_public_liuyaoi  sR    ((//0B0B0E0EF;;??3'--v/A/ABrP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                   j                  | j                  j                        }| j                  j                  |      }| j                  |j                  t        j                         y)z-Test that staff can access any LiuYao record.r   r   rR   N)rJ   rT   rA   rU   rE   rV   rW   rX   rY   r   rZ   rB   r]   s      rN   test_staff_access_to_any_liuyaoz3LiuYaoAnalysisTests.test_staff_access_to_any_liuyaoq  s     ((//0C0C0F0FG7HI;;??3'--v/A/AB ((//0A0A0D0DE;;??3'--v/A/ABrP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       t        d      5 }| j                  |_        | j                  j                  |ddid      }| j                  |j                  t        j                         |j                          d	d	d	       y	# 1 sw Y   y	xY w)
z.Test handling of boolean regenerate parameter.r   r   rR   re   r   Tro   rp   N)rJ   rT   rB   rU   rE   rV   r	   rF   rg   rh   rX   rY   r   rZ   ri   rM   r^   rk   r_   s       rN   test_boolean_regenerate_paramz1LiuYaoAnalysisTests.test_boolean_regenerate_param  s    ((//0A0A0D0DE7HI<=(,(?(?L% {{''"D)/ ( H X1163E3EF++- >==s   A,CCc                 .   | j                   j                  | j                  j                        }| j                  j                  dd       t        d      5 }| j                  |_        | j                  j                  |ddid      }| j                  |j                  t        j                         |j                          |j                          | j                  j                  |dd	id      }| j                  |j                  t        j                         |j                          |j                          | j                  j                  |dd
id      }| j                  |j                  t        j                         |j                          |j                          | j                  j                  |ddid      }| j                  |j                  t        j                         |j                          ddd       y# 1 sw Y   yxY w)zBTest handling of different string values for regenerate parameter.r   r   rR   re   r   truero   rp   yesr   tN)rJ   rT   rB   rU   rE   rV   r	   rF   rg   rh   rX   rY   r   rZ   ri   
reset_mockr   s       rN   %test_various_regenerate_string_valuesz9LiuYaoAnalysisTests.test_various_regenerate_string_values  s   ((//0A0A0D0DE7HI<=(,(?(?L% {{''"F+/ ( H X1163E3EF++-##% {{''"E*/ ( H X1163E3EF++-##% {{''"C(/ ( H X1163E3EF++-##% {{''"C(/ ( H X1163E3EF++-[ >==s   F*HHc                    | j                   j                  | j                  j                        }| j                  j                  dd       i |_        | j                  j                  |      }| j                  |j                  t        j                         | j                  d|j                         | j                  |j                  d   d       y)z(Test handling of empty analysis results.r   r   rR   r   r   Nr   rj   s       rN   test_empty_results_handlingz/LiuYaoAnalysisTests.test_empty_results_handling  s     ((//0A0A0D0DE7HI %'!;;##C( 	--v/T/TUh.x0':rP   c                 l   | j                   j                  | j                  j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         | j                  j                          | j                  j                  |      }| j                  |j                  t        j                         y)z4Test access to a LiuYao record without a user field.r   r   rR   r   r   N)rJ   rT   rD   rU   rE   rV   rW   rX   rY   r   rZ   logoutr]   s      rN   test_liuyao_without_userz,LiuYaoAnalysisTests.test_liuyao_without_user  s8   ((//0B0B0E0EF 	7HI;;??3'--v/A/AB7HI;;??3'--v/A/AB7HI;;??3'--v/A/AB 	;;??3'--v/A/ABrP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       d| j                  _        | j                  j                          | j                  j                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       y)z?Test handling when a LiuYao record has pending analysis status.r   r   rR   pendingr   NrJ   rT   rB   rU   rE   rV   rH   r>   rW   rX   rY   r   rZ   r[   rj   s       rN   !test_analysis_with_pending_statusz5LiuYaoAnalysisTests.test_analysis_with_pending_status  s     ((//0A0A0D0DE7HI -6) ;;??3'--v/A/ABx0)<rP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       d| j                  _        | j                  j                          | j                  j                  |      }| j                  |j                  t        j                         | j                  |j                  d   d       y)z=Test handling when a LiuYao record has error analysis status.r   r   rR   r   r   Nr   rj   s       rN   test_analysis_with_error_statusz3LiuYaoAnalysisTests.test_analysis_with_error_status  s     ((//0A0A0D0DE7HI -4) ;;??3'--v/A/ABx0':rP   c                    t         j                  j                  dt        j                         dddddd| j
                  	      }| j                  j                  |j                        }| j                  j                  d	d
       | j                  j                  |      }| j                  |j                  t        j                         y)z8Test handling of LiuYao records with malformed yao data.u   测试问题 - 格式错误invalid999r,   r   r   r   	r!   r"   r#   r$   r%   r&   r'   r(   r)   r   r   rR   Nr   r7   r?   r   r@   r:   rJ   rT   rU   rE   rV   rW   rX   rY   r   rZ   )rM   malformed_liuyaor^   r_   s       rN   test_malformed_liuyao_dataz.LiuYaoAnalysisTests.test_malformed_liuyao_data  s     ">>002,,. 1 

 ((//0@0C0CD7HI ;;??3'--v/A/ABrP   c                    ddddddddidddd	ddd	d
d
d	ddd	dd}t         j                  j                  dt        j                         dddddd| j
                  |
      }| j                  j                  |j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                         t!        d      5 }| j"                  |_        | j                  j'                  |      }| j                  |j                  t        j                         |j)                          ddd       y# 1 sw Y   yxY w)z8Test LiuYao records with complex data in the data field.r         )palaceshiyin)guar   r      )oguacgua)ge   )yearmonthdayhour)lybzu   测试问题 - 复杂数据r   r   r   )
r!   r"   r#   r$   r%   r&   r'   r(   r)   r[   r   r   rR   re   N)r   r7   r?   r   r@   r:   rJ   rT   rU   rE   rV   rW   rX   rY   r   rZ   r	   rF   rg   rh   ri   )rM   complex_datacomplex_liuyaor^   r_   rk   s         rN   #test_liuyao_with_complex_data_fieldz7LiuYaoAnalysisTests.test_liuyao_with_complex_data_field!  sR   
 !"!A-NO

  a( q)Q'a(	
  ..2,,.35U / 
 ((//0A0AB7HI;;??3'--v/A/AB <=(,(?(?L%{{'',HX1163E3EF++- >==s   :A'E**E3c                    g d}|D ]  }t         j                  j                  |t        j                         dddddd| j
                  	      }| j                  j                  |j                        }| j                  j                  dd       | j                  j                  |      }| j                  |j                  t        j                          y	)
z8Test handling of Unicode characters in LiuYao questions.)u   测试中文问题？🔮u   Test with émojis ✨💫u   Mixed 中英文 questionzSpecial chars: @#$%^&*()u   古代漢字問題r   r   r   r   r   r   rR   Nr   )rM   unicode_questionsr!   unicode_liuyaor^   r_   s         rN   test_unicode_question_handlingz2LiuYaoAnalysisTests.test_unicode_question_handlingG  s    
 *H#^^22!llnSUsu__	 3 N ,,33N4E4EFCKKL;LM{{s+HX1163E3EF *rP   c                    | j                   j                  | j                  j                        }| j                  j                  dd       t        d      5 }| j                  |_        g }t        d      D ].  }| j                  j                  |      }|j                  |       0 |D ],  }| j                  |j                  t        j                         . 	 ddd       y# 1 sw Y   yxY w)z7Test handling of multiple concurrent analysis requests.r   r   rR   re      N)rJ   rT   rB   rU   rE   rV   r	   rF   rg   rangerh   appendrX   rY   r   rZ   )rM   r^   rk   	responsesir_   s         rN   !test_concurrent_analysis_requestsz5LiuYaoAnalysisTests.test_concurrent_analysis_requestsa  s    ((//0A0A0D0DE7HI<=(,(?(?L% I1X;;++C0  * 
 &  !5!5v7I7IJ & >==s   BC##C,c                    ddz  }t         j                  j                  dt        j                         dddddd| j
                  |
      }| j                  j                  |j                        }| j                  j                  dd	
       | j                  j                  |      }| j                  |j                  t        j                         y)z=Test handling of LiuYao records with very large reading text.u'   这是一个非常长的解读内容。i  u   测试问题 - 大量文本r   r   r   r    r   r   rR   Nr   )rM   
large_textlarge_reading_liuyaor^   r_   s        rN   test_large_reading_textz+LiuYaoAnalysisTests.test_large_reading_texts  s    >E
%~~442,,.35U  5  
 ((//0D0G0GH7HI;;??3'--v/A/ABrP   N)"__name__
__module____qualname____doc__rO   r`   rd   r	   rl   rv   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    rP   rN   r   r      s   7k<^
2	0 45* 6* 455 65408P 45/ 6/ 450 60$ 45) 6)& 45) 6)$ 45* 6*" 45* 6*"JdCC .$2.h 45; 6;C, 45= 6= 45; 6;C,$.LG4K$CrP   r   )django.testr   r   django.urlsr   django.contrib.authr   liuyao.modelsr   accounts.modelsr   unittest.mockr	   r
   rest_frameworkr   django.utilsr   r   r   r   r   jsonr6   r   r   rP   rN   <module>r      s>    (  .   ' * ! ! 4 4 u	C( u	CrP   