
    P1ir                         d Z ddlZ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mZ 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  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)z
Comprehensive unit tests for AI analysis reporting API endpoints.

Tests cover:
- Report submission endpoints for BaZi, Number, LiuYao
- Authentication and authorization
- Input validation and error handling
- Edge cases and security scenarios
    N)TestCaseClient)get_user_model)reverse)timezone)datetime)APITestCase	APIClient)status)RefreshToken)Person)liuyao)patch	MagicMockc                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
ReportAPIAuthenticationTestsz:Test authentication and authorization for report endpointsc                    ddl m}  |       | _        t        j                  j                  dddd      | _        t        j                  j                  dd	d
d      | _        t        j                  j                  dt        ddd      | j                  dddi      | _        t        j                  j                  d| j                  t        j                         dddddddddi      | _        y)Set up test datar   $create_admin_with_report_permissions13800138000test@example.comTestUserphoneemail
first_name	last_name13800138001zother@example.comOtherTest Person     	completedbazi_analysiszTest contentname
birth_date
created_byanalysis_statusai_analysiszTest Question10responsezTest LiuYao contentquestionuserqdatey1y2y3y4y5y6r,   r-   N)tests.test_utilsr   adminr   objectscreate_userr3   
other_userr   creater   personr   r   nowliuyao_entryselfr   s     W/home/cursorai/projects/iching/iching/tests/../../tests/ai_report/test_reporting_api.pysetUpz"ReportAPIAuthenticationTests.setUp   s     	J9;
LL,,$	 - 
	 ,,22%	 3 
 nn++D!Q'yy'(.9 , 
 #NN11$,,.sssss'#%:; 2 
    c                     t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         y	)
z0Test BaZi report endpoint without authenticationapi:bazi_reportpkkwargsinappropriate_contentTest reportcategorymessagejsonformatN	r   rA   idclientpostassertEqualstatus_coder   HTTP_401_UNAUTHORIZEDrE   urldatar0   s       rF   'test_report_bazi_without_authenticationzDReportAPIAuthenticationTests.test_report_bazi_without_authenticationC   s]    't{{~~0FG3N;;##Cf#=--v/K/KLrH   c                     t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         y	)
z2Test LiuYao report endpoint without authenticationapi:liuyao_reportrK   rL   inaccurate_analysisrO   rP   rS   rT   N)	r   rC   rW   rX   rY   rZ   r[   r   r\   r]   s       rF   )test_report_liuyao_without_authenticationzFReportAPIAuthenticationTests.test_report_liuyao_without_authenticationK   sa    )49J9J9M9M2NO1mL;;##Cf#=--v/K/KLrH   c                     t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         y	)
z2Test Number report endpoint without authenticationapi:number_reportrK   rL   technical_errorrO   rP   rS   rT   NrV   r]   s       rF   )test_report_number_without_authenticationzFReportAPIAuthenticationTests.test_report_number_without_authenticationS   s]    )42HI--H;;##Cf#=--v/K/KLrH   c                    | j                   j                  | j                         t        dd| j                  j
                  i      }ddd}| j                   j                  ||d	      }| j                  |j                  t        j                         | j                  d
|j                  d   j                                y)z7Test that user cannot report other user's BaZi analysisr3   rJ   rK   rL   rN   rO   rP   rS   rT   	not founderrorN)rX   force_authenticater?   r   rA   rW   rY   rZ   r[   r   HTTP_400_BAD_REQUESTassertInr_   lowerr]   s       rF   test_report_other_users_baziz9ReportAPIAuthenticationTests.test_report_other_users_bazi[   s    &&DOO&<'t{{~~0FG3N;;##Cf#=--v/J/JKk8==#9#?#?#ABrH   c                    | j                   j                  | j                         t        dd| j                  j
                  i      }ddd}| j                   j                  ||d	      }| j                  |j                  t        j                         | j                  d
|j                  d   j                                y)z9Test that user cannot report other user's LiuYao analysisrj   rb   rK   rL   rN   rO   rP   rS   rT   rk   rl   N)rX   rm   r?   r   rC   rW   rY   rZ   r[   r   rn   ro   r_   rp   r]   s       rF   test_report_other_users_liuyaoz;ReportAPIAuthenticationTests.test_report_other_users_liuyaof   s    &&DOO&<)49J9J9M9M2NO3N;;##Cf#=--v/J/JKk8==#9#?#?#ABrH   c                    t        j                  | j                        }t        |j                        }| j
                  j                  d|        t        dd| j                  j                  i      }ddd}| j
                  j                  ||d	
      }| j                  |j                  t        j                         y)z)Test valid JWT token authentication workszBearer )HTTP_AUTHORIZATIONrJ   rK   rL   rN   rO   rP   rS   rT   N)r   for_userr3   straccess_tokenrX   credentialsr   rA   rW   rY   rZ   r[   r   HTTP_201_CREATED)rE   refreshrx   r^   r_   r0   s         rF   test_valid_jwt_authenticationz:ReportAPIAuthenticationTests.test_valid_jwt_authenticationq   s    ''		27//0W\N3KL't{{~~0FG3N;;##Cf#=--v/F/FGrH   N)__name__
__module____qualname____doc__rG   r`   rd   rh   rq   rs   r|    rH   rF   r   r      s/    D#
JMMM	C	CHrH   r   c                   h    e Zd ZdZd Z ed      d        Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)BaZiReportAPITestsz)Test BaZi analysis reporting API endpointc           
      L   ddl m}  |       | _        t        j                  j                  dddd      | _        t        j                  j                  dt        d	d
d
      | j                  dddidddi      | _
        | j                  j                  | j                         y)r   r   r   r   r   r   r   r   r#   r$   r%   r&   r'   zTest BaZi analysis contentnumber_analysiszTest number content)r)   r*   r+   r,   r-   number_analysis_statusnumber_ai_analysisrj   Nr;   r   r<   r   r=   r>   r3   r   r@   r   rA   rX   rm   rD   s     rF   rG   zBaZiReportAPITests.setUp   s     	J9;
LL,,$	 - 
	 nn++D!Q'yy'(*FG#. 13HI , 
 	&&DII&6rH   (api.utils.send_admin_report_notificationc                    d|_         t        dd| j                  j                  i      }ddd}| j                  j                  ||d	      }| j                  |j                  t        j                         | j                  |j                  d
   d       | j                  d|j                  d          | j                  j                          | j                  | j                  j                         | j                  | j                  j                  d       | j                  | j                  j                   d       | j                  | j                  j"                  d       |j%                          y)z'Test successful BaZi analysis reportingTrJ   rK   rL   rN   z,This analysis contains inappropriate contentrP   rS   rT   successsuccessfullyrR   pendingN)return_valuer   rA   rW   rX   rY   rZ   r[   r   rz   r_   ro   refresh_from_db
assertTruebazi_analysis_reportedbazi_report_categorybazi_report_messagebazi_report_statusassert_called_oncerE   
mock_emailr^   r_   r0   s        rF   test_report_bazi_successz+BaZiReportAPITests.test_report_bazi_success   s"    #'
't{{~~0FG/E

 ;;##Cf#=--v/F/FGy148nhmmI&>? 	##%::;99;RS88:hi77C 	%%'rH   c                     t        dd| j                  j                  i      }ddi}| j                  j	                  ||d      }| j                  |j                  t        j                         y)	z2Test BaZi reporting with missing required categoryrJ   rK   rL   rR   zMissing categoryrS   rT   N	r   rA   rW   rX   rY   rZ   r[   r   rn   r]   s       rF   !test_report_bazi_missing_categoryz4BaZiReportAPITests.test_report_bazi_missing_category   s^    't{{~~0FG-.;;##Cf#=--v/J/JKrH   c                     t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         y	)
z)Test BaZi reporting with invalid categoryrJ   rK   rL   invalid_categoryzInvalid category testrP   rS   rT   Nr   r]   s       rF   !test_report_bazi_invalid_categoryz4BaZiReportAPITests.test_report_bazi_invalid_category   sb    't{{~~0FG*.

 ;;##Cf#=--v/J/JKrH   c                 d   t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         | j                  j                          | j                  | j                  j                  d       y	)
z:Test BaZi reporting with empty message (should be allowed)rJ   rK   rL   rg    rP   rS   rT   Nr   rA   rW   rX   rY   rZ   r[   r   rz   r   r   r]   s       rF   test_report_bazi_empty_messagez1BaZiReportAPITests.test_report_bazi_empty_message   s    't{{~~0FG-"=;;##Cf#=--v/F/FG##%88"=rH   c                    t        dd| j                  j                  i      }d}d|d}| j                  j	                  ||d      }| j                  |j                  t        j                  t        j                  g       y	)
z*Test BaZi reporting with very long messagerJ   rK   rL     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAotherrP   rS   rT   N)
r   rA   rW   rX   rY   ro   r[   r   rz   rn   )rE   r^   long_messager_   r0   s        rF   test_report_bazi_long_messagez0BaZiReportAPITests.test_report_bazi_long_message   sp    't{{~~0FG!#

 ;;##Cf#=h**V-D-DfFaFa,bcrH   c                 x   d| j                   _        | j                   j                          t        dd| j                   j                  i      }ddd}| j
                  j                  ||d	      }| j                  |j                  t        j                         | j                  d
|j                  d          y)z2Test reporting BaZi analysis that is not completedr   rJ   rK   rL   rN   r   rP   rS   rT   cannot be reportedrl   N)rA   r,   saver   rW   rX   rY   rZ   r[   r   rn   ro   r_   r]   s       rF   test_report_bazi_not_completedz1BaZiReportAPITests.test_report_bazi_not_completed   s    &/#'t{{~~0FG3G;;##Cf#=--v/J/JK*HMM',BCrH   c                 x   d| j                   _        | j                   j                          t        dd| j                   j                  i      }ddd}| j
                  j                  ||d	      }| j                  |j                  t        j                         | j                  d
|j                  d          y)z5Test reporting BaZi analysis that is already reportedTrJ   rK   rL   rN   r   rP   rS   rT   r   rl   N)rA   r   r   r   rW   rX   rY   rZ   r[   r   rn   ro   r_   r]   s       rF   !test_report_bazi_already_reportedz4BaZiReportAPITests.test_report_bazi_already_reported   s    -1*'t{{~~0FG3G;;##Cf#=--v/J/JK*HMM',BCrH   c                     t        dddi      }ddd}| j                  j                  ||d	      }| j                  |j                  t
        j                         | j                  d
|j                  d          y)z!Test reporting nonexistent personrJ   rK   i rL   rN   r   rP   rS   rT   rk   rl   N)	r   rX   rY   rZ   r[   r   rn   ro   r_   r]   s       rF   #test_report_bazi_nonexistent_personz6BaZiReportAPITests.test_report_bazi_nonexistent_person   sk    'u>3G;;##Cf#=--v/J/JKk8==#9:rH   c                    t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         | j                  j                          | j                  | j                  j                         | j                  | j                  j                  d       | j                  | j                  j                  d       y	)
z)Test successful Number analysis reportingrf   rK   rL   rc   zNumber analysis is incorrectrP   rS   rT   N)r   rA   rW   rX   rY   rZ   r[   r   rz   r   r   number_analysis_reportednumber_report_categorynumber_report_messager]   s       rF   test_report_number_successz-BaZiReportAPITests.test_report_number_success  s    )42HI-5

 ;;##Cf#=--v/F/FG 	##%<<=;;=RS::<Z[rH   c                 :   d| j                   _        | j                   j                          t        dd| j                   j                  i      }ddd}| j
                  j                  ||d	      }| j                  |j                  t        j                         y)
z6Test reporting Number analysis when no analysis existsNrf   rK   rL   rg   zNo analysisrP   rS   rT   )rA   r   r   r   rW   rX   rY   rZ   r[   r   rn   r]   s       rF   test_report_number_no_analysisz1BaZiReportAPITests.test_report_number_no_analysis  sy    )-&)42HI--H;;##Cf#=--v/J/JKrH   N)r}   r~   r   r   rG   r   r   r   r   r   r   r   r   r   r   r   r   rH   rF   r   r      sX    372 56( 7(4L	L	>d
D
D;\$	LrH   r   c                   D    e Zd ZdZd Z ed      d        Zd Zd Zd Z	y)	LiuYaoReportAPITestsz+Test LiuYao analysis reporting API endpointc                 ^   ddl m}  |       | _        t        j                  j                  dddd      | _        t        j                  j                  d| j                  t        j                         d	d
d	d
d	d
dddi      | _        | j                  j                  | j                         y)r   r   r   r   r   r   r   r   zTest divination questionr.   r/   r&   r0   zTest LiuYao analysis contentr1   rj   N)r;   r   r<   r   r=   r>   r3   r   r@   r   rB   rC   rX   rm   rD   s     rF   rG   zLiuYaoReportAPITests.setUp#  s     	J9;
LL,,$	 - 
	 #NN11/,,.sssss'#%CD 2 
 	&&DII&6rH   r   c                    d|_         t        dd| j                  j                  i      }ddd}| j                  j                  ||d	      }| j                  |j                  t        j                         | j                  |j                  d
   d       | j                  j                          | j                  | j                  j                         | j                  | j                  j                  d       | j                  | j                  j                  d       | j                  | j                  j                   d       |j#                          y)z)Test successful LiuYao analysis reportingTrb   rK   rL   rc   z$The hexagram interpretation is wrongrP   rS   rT   r   r   N)r   r   rC   rW   rX   rY   rZ   r[   r   rz   r_   r   r   analysis_reportedreport_categoryreport_messagereport_statusr   r   s        rF   test_report_liuyao_successz/LiuYaoReportAPITests.test_report_liuyao_success;  s    #'
)49J9J9M9M2NO-=

 ;;##Cf#=--v/F/FGy148 	))+));;<**::<QR**99;ab**88)D 	%%'rH   c                 d   t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         | j                  j                          | j                  | j                  j                  d       y	)
z-Test LiuYao reporting with Unicode charactersrb   rK   rL   r   u+   这个分析包含中文字符和emoji 🔮rP   rS   rT   N)r   rC   rW   rX   rY   rZ   r[   r   rz   r   r   r]   s       rF   test_report_liuyao_with_unicodez4LiuYaoReportAPITests.test_report_liuyao_with_unicodeU  s    )49J9J9M9M2NOD

 ;;##Cf#=--v/F/FG))+**99;hirH   c                    g d}t        |      D ]  \  }}t        j                  j                  d| | j                  t        j                         ddddddddd| i      }t        d	d
|j                  i      }|d| d}| j                  j                  ||d      }| j                  |j                  t        j                         |j                          | j                  |j                   |        y)z/Test reporting LiuYao with all valid categoriesrN   rc   offensive_languagerg   r   zTest question r.   r/   r&   r0   zTest content r1   rb   rK   rL   zTest message for rP   rS   rT   N)	enumerater   r=   r@   r3   r   rB   r   rW   rX   rY   rZ   r[   r   rz   r   r   )rE   
categoriesirQ   entryr^   r_   r0   s           rF   !test_report_liuyao_all_categoriesz6LiuYaoReportAPITests.test_report_liuyao_all_categoriesc  s    G
 %Z0KAxNN)))!-YYlln33333 +'=)<= * E -tUXX6FGC$.xj9D
 {{''T&'AHX1163J3JK!!#U22H=+ 1rH   c                 L   t         j                  j                  ddt        j                         dddddddddi      }t        d	d
|j                  i      }ddd}| j                  j                  ||d      }| j                  |j                  t        j                         y)z4Test reporting LiuYao analysis created by guest userzGuest questionNr.   r/   r&   r0   zGuest analysisr1   rb   rK   rL   rg   zGuest reportrP   rS   rT   )r   r=   r@   r   rB   r   rW   rX   rY   rZ   r[   r   rn   )rE   guest_entryr^   r_   r0   s        rF   test_report_liuyao_guest_userz2LiuYaoReportAPITests.test_report_liuyao_guest_user  s    nn++%,,.sssss'#%56 , 
 )42HI-.I;;##Cf#=--v/J/JKrH   N)
r}   r~   r   r   rG   r   r   r   r   r   r   rH   rF   r   r      s5    570 56( 7(2j>8LrH   r   c                   \    e Zd ZdZd Zd Zd Zd Zd Zd Z	 e
d      d	        Zd
 Zd Zy)ReportAPIEdgeCaseTestsz6Test edge cases and security scenarios for report APIsc                     ddl m}  |       | _        t        j                  j                  dd      | _        | j                  j                  | j                         y)r   r   r   r   r   r   r   rj   N)	r;   r   r<   r   r=   r>   r3   rX   rm   rD   s     rF   rG   zReportAPIEdgeCaseTests.setUp  sN     	J9;
LL,,$ - 
	 	&&DII&6rH   c                 <   t         j                  j                  dt        ddd      | j                  dddi      }t        dd	|j                  i
      }| j                  j                  |dd      }| j                  |j                  t        j                         y)z'Test reporting with malformed JSON datar#   r$   r%   r&   testr_   r(   rJ   rK   rL   z7{"category": "inappropriate_content", "message": "test"zapplication/json)content_typeNr   r=   r@   r   r3   r   rW   rX   rY   rZ   r[   r   rn   rE   rA   r^   r0   s       rF   test_report_with_malformed_jsonz6ReportAPIEdgeCaseTests.test_report_with_malformed_json  s    &&D!Q'yy'( ' 
 'vyy0AB ;;##E+ $ 
 	--v/J/JKrH   c                    t         j                  j                  dt        ddd      | j                  dddi      }t        dd	|j                  i
      }ddd}| j                  j                  ||d      }| j                  |j                  t        j                         |j                          | j                  |j                  d       y)z4Test reporting with SQL injection attempt in messager#   r$   r%   r&   r   r_   r(   rJ   rK   rL   r   z'; DROP TABLE bazi_person; --rP   rS   rT   Nr   r=   r@   r   r3   r   rW   rX   rY   rZ   r[   r   rz   r   r   rE   rA   r^   r_   r0   s        rF   &test_report_with_sql_injection_attemptz=ReportAPIEdgeCaseTests.test_report_with_sql_injection_attempt  s    &&D!Q'yy'( ' 
 'vyy0AB6

 ;;##Cf#= 	--v/F/FG 	 335TUrH   c                    t         j                  j                  dt        ddd      | j                  dddi      }t        dd	|j                  i
      }ddd}| j                  j                  ||d      }| j                  |j                  t        j                         |j                          | j                  |j                  d       y)z*Test reporting with XSS attempt in messager#   r$   r%   r&   r   r_   r(   rJ   rK   rL   r   z<script>alert("XSS")</script>rP   rS   rT   Nr   r   s        rF   test_report_with_xss_attemptz3ReportAPIEdgeCaseTests.test_report_with_xss_attempt  s    &&D!Q'yy'( ' 
 'vyy0AB6

 ;;##Cf#=--v/F/FG 	 335TUrH   c                    t         j                  j                  dt        ddd      | j                  dddi      }t        dd	|j                  i
      }ddd}| j                  j                  ||d      }| j                  |j                  t        j                         d|d<   | j                  j                  ||d      }| j                  |j                  t        j                         y)z+Test handling of concurrent report requestszConcurrent Testr$   r%   r&   r   r_   r(   rJ   rK   rL   rN   zFirst reportrP   rS   rT   zSecond reportrR   N)r   r=   r@   r   r3   r   rW   rX   rY   rZ   r[   r   rz   rn   )rE   rA   r^   r_   	response1	response2s         rF   test_report_concurrent_requestsz6ReportAPIEdgeCaseTests.test_report_concurrent_requests  s    &&"D!Q'yy'( ' 
 'vyy0AB3O KK$$S$v$>	..0G0GH *YKK$$S$v$>	..0K0KLrH   c                 B   t         j                  j                  dt        ddd      | j                  di       }t        dd|j                  i      }d	d
d}| j                  j                  ||d      }| j                  |j                  t        j                         y)z4Test reporting analysis with missing or corrupt datazMissing Data Testr$   r%   r&   r(   rJ   rK   rL   rg   zMissing datarP   rS   rT   Nr   r   s        rF   &test_report_with_missing_analysis_dataz=ReportAPIEdgeCaseTests.test_report_with_missing_analysis_data  s    &&$D!Q'yy' ' 
 'vyy0AB-.I ;;##Cf#=--v/J/JKrH   r   c                    d|_         t        j                  j                  dt	        ddd      | j
                  dddi      }t        d	d
|j                  i      }ddd}| j                  j                  ||d      }| j                  |j                  t        j                         |j                          | j                  |j                          y)z+Test handling when email notification failsFzEmail Failure Testr$   r%   r&   r   r_   r(   rJ   rK   rL   rN   z
Email testrP   rS   rT   N)r   r   r=   r@   r   r3   r   rW   rX   rY   rZ   r[   r   rz   r   r   r   )rE   r   rA   r^   r_   r0   s         rF   "test_report_email_failure_handlingz9ReportAPIEdgeCaseTests.test_report_email_failure_handling  s     #(
&&%D!Q'yy'( ' 
 'vyy0AB3M ;;##Cf#=--v/F/FG 	 556rH   c           
         g }t        d      D ]T  }t        j                  j                  d| t	        ddd      | j
                  ddd| i      }|j                  |       V t        |      D ]n  \  }}t        d	d
|j                  i      }dd| d}| j                  j                  ||d      }| j                  |j                  t        j                         p y)zFTest multiple rapid report attempts (simulates rate limiting scenario)   zRate Limit Test r$   r%   r&   r   zdata r(   rJ   rK   rL   r   zRapid report rP   rS   rT   N)ranger   r=   r@   r   r3   appendr   r   rW   rX   rY   rZ   r[   r   rz   )rE   personsr   rA   r^   r_   r0   s          rF   $test_report_rate_limiting_simulationz;ReportAPIEdgeCaseTests.test_report_rate_limiting_simulation%  s     qA^^**'s+a+99 +#uQC[1 + F NN6"  #7+IAv+T6994EFC 'mA34GHD{{''T&'AHX1163J3JK ,rH   c                 T   t         j                  j                  dt        ddd      | j                  dddi      }t        dd	|j                  i
      }| j                  j                  |      }| j                  |j                  t        j                         | j                  j                  |ddid      }| j                  |j                  t        j                         | j                  j                  |      }| j                  |j                  t        j                         y)z-Test invalid HTTP methods on report endpointszMethod Testr$   r%   r&   r   r_   r(   rJ   rK   rL   rQ   r   rS   rT   N)r   r=   r@   r   r3   r   rW   rX   getrZ   r[   r   HTTP_405_METHOD_NOT_ALLOWEDputdeleter   s       rF   test_invalid_http_methodsz0ReportAPIEdgeCaseTests.test_invalid_http_methods;  s    &&D!Q'yy'( ' 
 'vyy0AB ;;??3'--v/Q/QR ;;??3W(=f?M--v/Q/QR ;;%%c*--v/Q/QRrH   N)r}   r~   r   r   rG   r   r   r   r   r   r   r   r   r   r   rH   rF   r   r     sN    @
7L*V2V.M,L" 567 77.L,SrH   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)ReportAPISerializerTestsz)Test serializer validation and edge casesc                 @   ddl m}  |       | _        t        j                  j                  dd      | _        t        j                  j                  dt        ddd      | j                  d	d
di      | _
        | j                  j                  | j                         y)r   r   r   r   r   r   zSerializer Testr$   r%   r&   r   r_   r(   rj   Nr   rD   s     rF   rG   zReportAPISerializerTests.setUpW  s     	J9;
LL,,$ - 
	
 nn++"D!Q'yy'( , 
 	&&DII&6rH   c           	         t        dd| j                  j                  i      }g d}|D ]  }t        j                  j                  d| t        ddd      | j                  dd	d
i      }t        dd|j                  i      }|dd}| j                  j                  ||d      }| j                  |j                  t        j                          y)z-Test category validation with boundary valuesrJ   rK   rL   r   zTest r$   r%   r&   r   r_   r(   zValid category testrP   rS   rT   N)r   rA   rW   r   r=   r@   r   r3   rX   rY   rZ   r[   r   rz   )rE   r^   valid_categoriesrQ   rA   r_   r0   s          rF   (test_category_validation_boundary_valueszAReportAPISerializerTests.test_category_validation_boundary_valuesl  s    't{{~~0FG

 )H^^**XJ'a+99 +#V, + F +T6994EFC (5JKD{{''T&'AHX1163J3JK )rH   c                 n   t        dd| j                  j                  i      }d}d|d}| j                  j	                  ||d      }| j                  |j                  t        j                  t        j                  g       t        j                  j                  d	t        d
dd      | j                  dddi      }t        dd|j                  i      }d}d|d}| j                  j	                  ||d      }| j                  |j                  t        j                  t        j                  g       y)z)Test message length validation boundariesrJ   rK   rL     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr   rP   rS   rT   z	Test 1001r$   r%   r&   r   r_   r(     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN)r   rA   rW   rX   rY   ro   r[   r   rz   rn   r   r=   r@   r   r3   )rE   r^   message_1000r_   r0   person2url2message_1001s           rF   test_message_length_validationz7ReportAPISerializerTests.test_message_length_validation  s   't{{~~0FG "#=;;##Cf#=h**V-D-DfFaFa,bc ..''D!Q'yy'( ( 
 ($

1CD!#=;;##D$v#>h**V-D-DfFaFa,bcrH   c                 b   t        dd| j                  j                  i      }ddi}| j                  j	                  ||d      }| j                  |j                  t        j                         | j                  j                          | j                  | j                  j                  d       y	)
z)Test that message field is truly optionalrJ   rK   rL   rQ   rg   rS   rT   r   Nr   r]   s       rF   test_optional_message_fieldz4ReportAPISerializerTests.test_optional_message_field  s    't{{~~0FG -.;;##Cf#=--v/F/FG##%88"=rH   c                 &   t        dd| j                  j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         t        j                  j                  d	t        d
dd      | j                  dddi      }t        dd|j                  i      }ddd}| j                  j	                  ||d      }| j                  |j                  t        j                         y)z)Test category validation case sensitivityrJ   rK   rL   INAPPROPRIATE_CONTENTz	Case testrP   rS   rT   zCase Test 2r$   r%   r&   r   r_   r(   Inappropriate_ContentzMixed case testN)r   rA   rW   rX   rY   rZ   r[   r   rn   r   r=   r@   r   r3   )rE   r^   r_   r0   r   r   s         rF   test_category_case_sensitivityz7ReportAPISerializerTests.test_category_case_sensitivity  s    't{{~~0FG 4L;;##Cf#=--v/J/JK ..''D!Q'yy'( ( 
 ($

1CD3@QR;;##D$v#>--v/J/JKrH   N)	r}   r~   r   r   rG   r   r   r   r  r   rH   rF   r   r   T  s!    37*L2d6
>LrH   r   )"r   rS   django.testr   r   django.contrib.authr   django.urlsr   django.utilsr   datetimer   r	   rest_framework.testr
   r   rest_frameworkr   rest_framework_simplejwt.tokensr   bazi.modelsr   liuyao.modelsr   unittest.mockr   r   r   r   r   r   r   r   r   rH   rF   <module>r     s     ( .  !  6 ! 8    *aH; aHH^L ^LBoL; oLdS[ SDmL{ mLrH   