Ë
    ­mâirk  ã                   óp   — d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ  G d„ d	«      Zy)
z
API tests module
é    N©ÚPath)ÚDictÚOptionalÚList)ÚLogger)Ú	HTTPUtils)ÚAPIAnalyzerc                   ó
  — e Zd ZdZddededefd„Zddedefd	„Zdedefd
„Z	defd„Z
defd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zd„ Zdd„Zdefd„Zy)ÚAPITestszTest all API endpointsNÚloggerÚbase_urlÚproject_dirc                 ó*  — || _         t        ||«      | _        |rt        |«      n,t        t        «      j
                  j
                  j
                  | _        t        t        | j                  «      «      | _	        ddddœ| _
        d | _        d | _        y )NÚ	testadminztestadmin@example.comzTestAdmin123!)ÚusernameÚemailÚpassword)r   r	   Ú
http_utilsr   Ú__file__Úparentr   r
   ÚstrÚapi_analyzerÚ	test_userÚaccess_tokenÚuser_id)Úselfr   r   r   s       ú6/home/factor_ks/STREAMA2026/tests/modules/api_tests.pyÚ__init__zAPITests.__init__   sy   € ØˆŒÜ# F¨HÓ5ˆŒÙ0;œ4 Ô,ÄÄhÃ×AVÑAV×A]ÑA]×AdÑAdˆÔÜ'¬¨D×,<Ñ,<Ó(=Ó>ˆÔà#Ø,Ø'ñ
ˆŒð
 ,0ˆÔØ&*ˆ�ó    Úauto_fixÚreturnc                 óp  — | j                   j                  d«       | j                  |«      sy| j                  «       sy| j	                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j                  «       sy| j!                  «        | j                   j#                  dd«       y)zRun all API testsz	API TestsFÚAPIzAll API tests passedT)r   Ú	subheaderÚ_create_test_userÚ_test_authenticationÚ_test_health_endpointÚ_test_stream_endpointsÚ_test_comment_endpointsÚ_test_tag_endpointsÚ_test_settings_endpointsÚ_test_watch_history_endpointsÚ_test_user_endpointsÚ_test_admin_endpointsÚ_test_backup_endpointsÚ_test_chat_endpointsÚ_test_twitch_auth_endpointsÚ_test_manual_importÚ"_generate_endpoint_coverage_reportÚsuccess)r   r!   s     r   Úrun_all_testszAPITests.run_all_tests   s*  € à�‰×Ñ˜kÔ*ð ×%Ñ% hÔ/Øð ×(Ñ(Ô*Øð ×)Ñ)Ô+Øð ×*Ñ*Ô,Øð ×+Ñ+Ô-Øð ×'Ñ'Ô)Øð ×,Ñ,Ô.Øð ×1Ñ1Ô3Øð ×(Ñ(Ô*Øð ×)Ñ)Ô+Øð ×*Ñ*Ô,Øð ×(Ñ(Ô*Øð ×/Ñ/Ô1Øð ×'Ñ'Ô)Øð 	×/Ñ/Ô1à�‰×Ñ˜EÐ#9Ô:Ør    c                 ó^  — | j                   j                  dd«       | j                  j                  d| j                  ¬«      \  }}}|rB|dk(  r=| j                   j                  dd«       | j                  «       sy| j                  «       S |rB|dk(  r=| j                   j                  dd	«       | j                  «       sy| j                  «       S | j                   j                  dd
|› �«       |r=| j                   j                  dd«       | j                  «       sy| j                  «       S y)z$Create test admin user if not existsr$   zCreating test admin user...z/api/auth/register©Ú	json_dataéÉ   z$Test admin user created successfullyFé�  z-User might already exist, attempting login...zFailed to create test user: z)Attempting to login with existing user...)	r   Úinfor   Úpostr   r5   Ú_login_userÚ_set_user_as_adminÚerror)r   r!   r5   Ústatus_codeÚresponses        r   r&   zAPITests._create_test_user_   s  € à�‰×Ñ˜Ð =Ô>ð *.¯©×)=Ñ)=Ø Ø—n‘nð *>ó *
Ñ&ˆ�˜hñ
 �{ cÒ)Ø�K‰K×Ñ Ð'MÔNà×#Ñ#Ô%Øà×*Ñ*Ó,Ð,Ù˜¨Ò+à�K‰K×Ñ˜UÐ$SÔTØ×#Ñ#Ô%Øà×*Ñ*Ó,Ð,à�K‰K×Ñ˜eÐ'CÀHÀ:Ð%NÔOÙØ—‘× Ñ  Ð(SÔTØ×'Ñ'Ô)Ø à×.Ñ.Ó0Ð0Ør    c                 óÆ  — | j                   j                  d| j                  d   | j                  d   dœ¬«      \  }}}|�r|dk(  rü|j                  d«      | _        |j                  di «      j                  d	«      | _        | j                   j                  | j                  «       | j                   j                  rh| j                   j                  j                  }|j                  «       D ]5  \  }}| j                   j                  j                  j                  ||«       Œ7 | j                  j                  d
d«       y| j                  j                  d
d|› �«       y)zLogin as test userz/api/auth/loginr   r   )r   r   r8   éÈ   r   ÚuserÚidr$   zLogin successfulTzLogin failed: F)r   r=   r   Úgetr   r   Úset_auth_tokenÚlast_responseÚcookiesÚitemsÚsessionÚsetr   r5   r@   )r   r5   rA   rB   rJ   Úcookie_nameÚcookie_values          r   r>   zAPITests._login_user�   s,  € à)-¯©×)=Ñ)=Øà ŸN™N¨:Ñ6Ø ŸN™N¨:Ñ6ñð *>ó *
Ñ&ˆ�˜hò �{ cÒ)Ø (§¡¨^Ó <ˆDÔØ#Ÿ<™<¨°Ó3×7Ñ7¸Ó=ˆDŒLØ�O‰O×*Ñ*¨4×+<Ñ+<Ô=ð �‰×,Ò,ØŸ/™/×7Ñ7×?Ñ?�Ø18·±³ò SÑ-�K Ø—O‘O×+Ñ+×3Ñ3×7Ñ7¸À\ÕRðSð �K‰K×Ñ Ð'9Ô:Øà�K‰K×Ñ˜e ~°h°ZÐ%@ÔAØr    c                 ó,  — 	 ddl }ddl}| j                  j                  dd«       | j                  j                  d«      \  }}}|r|dk7  r | j                  j                  dd|› �«       y|j                  d	«      }|s| j                  j                  dd
«       y	 |j                  t        |«      «       ddddddddddd|› d�g}|j                  |ddd¬«      }|j                  dk(  r| j                  j                  dd«       y| j                  j                  dd|j                  › �«       y# t        $ r" | j                  j                  dd|› �«       Y yw xY w# t        $ r)}	| j                  j                  dd|	› �«       Y d}	~	yd}	~	ww xY w)z+Set test user as admin directly in databaser   Nr$   zSetting test user as admin...ú/api/auth/merD   zFailed to get user info: FrF   zUser ID not found in responsezInvalid user ID format: ÚdockerÚcomposeÚexecÚpostgresÚpsqlú-UÚstreamaú-dÚstreama2026ú-czSUPDATE users SET role_id = (SELECT id FROM roles WHERE name = 'admin') WHERE id = 'z'::uuid;Té
   )Úcapture_outputÚtextÚtimeoutz#Test user set as admin successfullyzFailed to set user as admin: )Ú
subprocessÚuuidr   r<   r   rG   r@   ÚUUIDr   Ú
ValueErrorÚrunÚ
returncoder5   ÚstderrÚ	Exception)
r   r`   ra   r5   rA   rB   r   ÚcmdÚresultÚes
             r   r?   zAPITests._set_user_as_adminœ   s—  € ð(	ÛÛØ�K‰K×Ñ˜UÐ$CÔDð .2¯_©_×-@Ñ-@ÀÓ-PÑ*ˆG�[ (Ù˜k¨SÒ0Ø—‘×!Ñ! %Ð+DÀXÀJÐ)OÔPØà—l‘l 4Ó(ˆGÙØ—‘×!Ñ! %Ð)HÔIØðØ—	‘	œ#˜g›,Ô'ð ˜) V¨ZØ˜˜i¨¨}ØÐkÐlsÐktÐt|Ð}ðˆCð  —^‘^ C¸À4ÐQS�^ÓTˆFØ× Ñ  AÒ%Ø—‘×#Ñ# EÐ+PÔQØà—‘×!Ñ! %Ð+HÈÏÉÈÐ)XÔYØøô# ò Ø—‘×!Ñ! %Ð+CÀGÀ9Ð)MÔNÙðûô& ò 	Ø�K‰K×Ñ˜eÐ'DÀQÀCÐ%HÔIÜûð	úsI   ‚A)E! Á,/E! ÂD3 Â7AE! Ä	)E! Ä3(EÅE! ÅEÅE! Å!	FÅ*FÆFc                 óÈ  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       n | j                   j                  dd|› �«       y| j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd	«       y| j                   j                  dd
|› d�«       y)zTest authentication flowr$   zTesting authentication flow...rQ   rD   zGET /api/auth/me: 200zGET /api/auth/me failed: Fz/api/auth/refreshzPOST /api/auth/refresh: 200zPOST /api/auth/refresh failed: z (may require cookie)T)r   r<   r   rG   r5   r@   r=   Úwarning©r   r5   rA   rB   s       r   r'   zAPITests._test_authenticationÈ   sØ   € à�‰×Ñ˜Ð @ÔAð *.¯©×)<Ñ)<¸^Ó)LÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'>Õ?à�K‰K×Ñ˜eÐ'@ÀÀÐ%NÔOØð *.¯©×)=Ñ)=Ð>QÓ)RÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'DÔEð ð �K‰K×Ñ Ð)HÈÈÐUjÐ'kÔlàr    c                 ó   — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       y| j                   j                  dd|› �«       y)	zTest health endpointr$   zTesting health endpoint...z/api/healthrD   zGET /api/health: 200TzGET /api/health failed: F)r   r<   r   rG   r5   r@   rm   s       r   r(   zAPITests._test_health_endpointÝ   ss   € à�‰×Ñ˜Ð <Ô=à)-¯©×)<Ñ)<¸]Ó)KÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'=Ô>Øà�K‰K×Ñ˜eÐ'?À¸}Ð%MÔNØr    c                 ó”  — | j                   j                  dd«       g d¢}d}|D ]¼  \  }}| j                  j                  |«      \  }}}|r%|dk(  r | j                   j	                  d|› d�«       ŒL|r%|dk(  r | j                   j                  d|› d�«       Œs|r%|d	k(  r | j                   j                  d|› d
�«       Œš| j                   j                  d|› d|› �«       d}Œ¾ | j                  j                  dddi¬«      \  }}}|r#|dk(  r| j                   j	                  dd«       |S | j                   j                  dd«       |S )zTest stream endpointsr$   zTesting stream endpoints...))zGET /api/streamsz/api/streams)zGET /api/streams/latestz/api/streams/latest)zGET /api/streams/popularz/api/streams/popular)zGET /api/streams/randomz/api/streams/random)zGET /api/streams/admin/allú/api/streams/admin/allTrD   z: 200é‘  z: 401 (authentication required)é“  z: 403 (admin required)z	 failed: Fz/api/streams/searchÚqÚtest)ÚparamszGET /api/streams/search: 200z.GET /api/streams/search: no results (expected)©r   r<   r   rG   r5   rl   r@   )r   Ú	endpointsÚall_okÚnameÚendpointr5   rA   rB   s           r   r)   zAPITests._test_stream_endpointsé   sS  € à�‰×Ñ˜Ð =Ô>ò
ˆ	ð ˆØ'ò 
	‰NˆD�(Ø-1¯_©_×-@Ñ-@ÀÓ-JÑ*ˆG�[ (Ù˜;¨#Ò-Ø—‘×#Ñ# E¨d¨V°5¨>Õ:Ù˜[¨CÒ/Ø—‘×#Ñ# E¨d¨VÐ3RÐ+SÕTÙ˜[¨CÒ/Ø—‘×#Ñ# E¨d¨VÐ3IÐ+JÕKà—‘×!Ñ! %¨D¨6°¸;¸-Ð)HÔIØ‘ð
	ð *.¯©×)<Ñ)<Ð=RÐ\_ÐagÐ[hÐ)<Ó)iÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'EÔFð ˆð �K‰K×Ñ Ð'WÔXàˆr    c                 óÎ  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j                  dd«       y|r"|dk(  r| j                   j                  dd«       y|r"|dk(  r| j                   j                  dd	«       y|r | j                   j	                  dd
|› �«       y| j                   j                  dd«       y)zTest comment endpointsr$   zTesting comment endpoints...z:/api/streams/00000000-0000-0000-0000-000000000000/commentsrq   zDGET /api/streams/{stream_id}/comments: 401 (authentication required)é”  zPGET /api/streams/{stream_id}/comments: 404 (invalid stream_id - endpoint exists)rr   zEGET /api/streams/{stream_id}/comments: 403 (insufficient permissions)z'GET /api/streams/{stream_id}/comments: z5GET /api/streams/{stream_id}/comments: request failedT)r   r<   r   rG   rl   r@   rm   s       r   r*   z APITests._test_comment_endpoints  sç   € à�‰×Ñ˜Ð >Ô?ð
 *.¯©×)<Ñ)<Ð=yÓ)zÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ˜UÐ$jÔkð ñ ˜¨Ò+Ø�K‰K×Ñ˜UÐ$vÔwð ñ ˜¨Ò+Ø�K‰K×Ñ˜UÐ$kÔlð ñ Ø�K‰K×Ñ Ð)RÐS^ÐR_Ð'`Ôað ð �K‰K×Ñ˜eÐ%\Ô]àr    c                 óH  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       y|r"|dk(  r| j                   j                  dd«       y| j                   j                  dd	|› �«       y
)zTest tag endpointsr$   zTesting tag endpoints...z	/api/tagsrD   zGET /api/tags: 200Trq   zMGET /api/tags: 401 (authentication required - test user may not be logged in)zGET /api/tags failed: Frv   rm   s       r   r+   zAPITests._test_tag_endpoints   s—   € à�‰×Ñ˜Ð :Ô;ð *.¯©×)<Ñ)<¸[Ó)IÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð';Ô<ØÙ˜¨Ò+Ø�K‰K×Ñ Ð'vÔwØà�K‰K×Ñ˜eÐ'=¸k¸]Ð%KÔLØr    c                 ó  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       y| j                   j                  dd|› d�«       y)	zTest settings endpointsr$   zTesting settings endpoints...z/api/settingsrD   zGET /api/settings: 200TzGET /api/settings failed: ú (may be optional)©r   r<   r   rG   r5   rl   rm   s       r   r,   z!APITests._test_settings_endpoints0  sx   € à�‰×Ñ˜Ð ?Ô@ð *.¯©×)<Ñ)<¸_Ó)MÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'?Ô@Øà�K‰K×Ñ Ð)CÀKÀ=ÐPbÐ'cÔdØr    c                 ó  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       y| j                   j                  dd|› d�«       y)	zTest watch history endpointsr$   z"Testing watch history endpoints...z/api/users/me/watch-historyrD   z$GET /api/users/me/watch-history: 200Tz(GET /api/users/me/watch-history failed: r   r€   rm   s       r   r-   z&APITests._test_watch_history_endpoints=  s{   € à�‰×Ñ˜Ð DÔEð *.¯©×)<Ñ)<Ð=ZÓ)[Ñ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'MÔNØà�K‰K×Ñ Ð)QÐR]ÐQ^Ð^pÐ'qÔrØr    c                 óà  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j                  dd«       ne|r"|dk(  r| j                   j                  dd«       nA|r | j                   j	                  dd|› �«       n| j                   j                  dd	|› �«       | j                  j                  d
«      \  }}}|r"|dk(  r| j                   j                  dd«       y|r"|dk(  r| j                   j	                  dd«       y|r"|dk(  r| j                   j	                  dd«       y| j                   j	                  dd|› �«       y)zTest user endpointsr$   zTesting user endpoints...z/api/users/me/profile-imagerq   z?POST /api/users/me/profile-image: 401 (authentication required)i¦  zEPOST /api/users/me/profile-image: 422 (no image data sent - expected)z"POST /api/users/me/profile-image: z)POST /api/users/me/profile-image failed: z/api/admin/usersrD   zGET /api/admin/users: 200z%GET /api/admin/users: 401 (not admin)rr   z4GET /api/admin/users: 403 (insufficient permissions)zGET /api/admin/users failed: T)r   r<   r   r=   rl   r@   rG   r5   rm   s       r   r.   zAPITests._test_user_endpointsJ  s_  € à�‰×Ñ˜Ð ;Ô<ð *.¯©×)=Ñ)=Ð>[Ó)\Ñ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ˜UÐ$eÕfÙ˜¨Ò+Ø�K‰K×Ñ˜UÐ$kÕlÙØ�K‰K×Ñ Ð)KÈKÈ=Ð'YÕZà�K‰K×Ñ˜eÐ'PÐQ\ÐP]Ð%^Ô_ð *.¯©×)<Ñ)<Ð=OÓ)PÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'BÔCð ñ ˜¨Ò+Ø�K‰K×Ñ Ð'NÔOð ñ ˜¨Ò+Ø�K‰K×Ñ Ð']Ô^ð ð �K‰K×Ñ Ð)FÀ{ÀmÐ'TÔUàr    c                 óH  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       y|r"|dk(  r| j                   j                  dd«       y| j                   j                  dd	|› �«       y
)zTest admin endpointsr$   zTesting admin endpoints...rp   rD   zGET /api/streams/admin/all: 200Trr   z+GET /api/streams/admin/all: 403 (not admin)z#GET /api/streams/admin/all failed: Frv   rm   s       r   r/   zAPITests._test_admin_endpointsi  s˜   € à�‰×Ñ˜Ð <Ô=ð *.¯©×)<Ñ)<Ð=UÓ)VÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'HÔIØÙ˜¨Ò+Ø�K‰K×Ñ Ð'TÔUØà�K‰K×Ñ˜eÐ'JÈ;È-Ð%XÔYØr    c                 óH  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       y|r"|dk(  r| j                   j                  dd«       y| j                   j                  dd	|› �«       y)
zTest backup endpointsr$   zTesting backup endpoints...z/api/admin/backuprD   zGET /api/admin/backup: 200Trr   z&GET /api/admin/backup: 403 (not admin)zGET /api/admin/backup failed: r€   rm   s       r   r0   zAPITests._test_backup_endpointsy  s˜   € à�‰×Ñ˜Ð =Ô>ð *.¯©×)<Ñ)<Ð=PÓ)QÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð'CÔDØÙ˜¨Ò+Ø�K‰K×Ñ Ð'OÔPØà�K‰K×Ñ Ð)GÈÀ}Ð'UÔVØr    c                 óØ  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r"|dk(  r| j                   j	                  dd«       ng|r"|dk(  r| j                   j                  dd«       nC|r"|dk(  r| j                   j                  dd	«       n| j                   j                  dd
|› �«       | j                  j                  d«      \  }}}|r!|dv r| j                   j                  dd«       y|r"|dk(  r| j                   j                  dd«       y|r | j                   j                  dd|› �«       y| j                   j                  dd«       y)zTest chat endpointsr$   zTesting chat endpoints...z	/api/chatrD   zGET /api/chat: 200rq   z,GET /api/chat: 401 (authentication required)r|   z1GET /api/chat: 404 (chat feature not implemented)zGET /api/chat: z/api/chat/proxy-image)r;   rq   z@GET /api/chat/proxy-image: endpoint exists (requires parameters)z=GET /api/chat/proxy-image: 404 (chat feature not implemented)zGET /api/chat/proxy-image: z)GET /api/chat/proxy-image: request failedTr€   rm   s       r   r1   zAPITests._test_chat_endpoints‰  sT  € à�‰×Ñ˜Ð ;Ô<ð *.¯©×)<Ñ)<¸[Ó)IÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ Ð';Õ<Ù˜¨Ò+Ø�K‰K×Ñ˜UÐ$RÕSÙ˜¨Ò+Ø�K‰K×Ñ˜UÐ$WÕXà�K‰K×Ñ ¨¸¸Ð'FÔGð *.¯©×)<Ñ)<Ð=TÓ)UÑ&ˆ�˜hÙ�{ jÑ0Ø�K‰K×Ñ˜UÐ$fÔgð ñ ˜¨Ò+Ø�K‰K×Ñ˜UÐ$cÔdð ñ Ø�K‰K×Ñ Ð)DÀ[ÀMÐ'RÔSð ð �K‰K×Ñ˜UÐ$OÔPàr    c                 óØ  — | j                   j                  dd«       | j                  j                  d«      \  }}}|r!|dv r| j                   j	                  dd«       nb|r"|dk(  r| j                   j                  dd«       n>|r | j                   j                  dd|› �«       n| j                   j                  dd	«       | j                  j                  d
«      \  }}}|r"|dk(  r| j                   j                  dd«       y|r"|dk(  r| j                   j	                  dd«       y|r"|dk(  r| j                   j                  dd«       y| j                   j                  dd|› �«       y)zTest twitch auth endpointsr$   z Testing twitch auth endpoints...z/api/twitch-auth/login)i.  i3  z/GET /api/twitch-auth/login: redirect (expected)r|   z=GET /api/twitch-auth/login: 404 (twitch auth not implemented)zGET /api/twitch-auth/login: z*GET /api/twitch-auth/login: request failedz/api/twitch-auth/unlinkrq   z;POST /api/twitch-auth/unlink: 401 (authentication required)éÌ   z.POST /api/twitch-auth/unlink: 204 (no content)z?POST /api/twitch-auth/unlink: 404 (twitch auth not implemented)zPOST /api/twitch-auth/unlink: T)r   r<   r   rG   r5   rl   r=   rm   s       r   r2   z$APITests._test_twitch_auth_endpoints¥  sV  € à�‰×Ñ˜Ð BÔCð *.¯©×)<Ñ)<Ð=UÓ)VÑ&ˆ�˜hÙ�{ jÑ0Ø�K‰K×Ñ Ð'XÕYÙ˜¨Ò+Ø�K‰K×Ñ˜UÐ$cÕdÙØ�K‰K×Ñ Ð)EÀkÀ]Ð'SÕTà�K‰K×Ñ˜UÐ$PÔQð *.¯©×)=Ñ)=Ð>WÓ)XÑ&ˆ�˜hÙ�{ cÒ)Ø�K‰K×Ñ˜UÐ$aÔbð ñ ˜¨Ò+Ø�K‰K×Ñ Ð'WÔXð ñ ˜¨Ò+Ø�K‰K×Ñ˜UÐ$eÔfð ð �K‰K×Ñ˜UÐ&DÀ[ÀMÐ$RÔSàr    c                 óP  — | j                   rå| j                  j                  dd«       	 ddl}ddlm}  |t        «      j                  j                  j                  }dddd	d
ddddddd| j                  d   › d�g}|j                  |t        |«      ddd¬«      }|j                  dk(  r| j                  j                  dd«       y| j                  j                  dd|j                  › �«       yy# t        $ r)}| j                  j                  dd|› �«       Y d}~yd}~ww xY w)zCleanup test user if neededr$   z'Cleaning up test user via PostgreSQL...r   Nr   rR   rS   rT   z-TrU   rV   rW   rX   rY   rZ   r[   z$DELETE FROM users WHERE username = 'r   z';Tr\   )Úcwdr]   r^   r_   z-Test user deleted successfully via PostgreSQLzFailed to delete test user: z,Failed to cleanup test user via PostgreSQL: )r   r   r<   r`   Úpathlibr   r   r   r   rd   r   re   r5   rl   rf   rg   )r   r`   r   Úproject_rootrh   ri   rj   s          r   ÚcleanupzAPITests.cleanupÁ  s'  € à�<Š<Ø�K‰K×Ñ˜UÐ$MÔNð_Û!Ý(Ù#¤H›~×4Ñ4×;Ñ;×BÑB�ð ˜i¨°°zØ˜D )¨T°=ØÐ@ÀÇÁÐPZÑA[Ð@\Ð\^Ð_ð�ð $Ÿ™ØÜ˜LÓ)Ø#'ØØð (ó �ð ×$Ñ$¨Ò)Ø—K‘K×'Ñ'¨Ð/^Õ_à—K‘K×'Ñ'¨Ð1MÈfÏmÉmÈ_Ð/]Õ^ð3 øô4 ò _Ø—‘×#Ñ# EÐ-YÐZ[ÐY\Ð+]×^Ñ^ûð_ús   ªBC3 Ã)C3 Ã3	D%Ã<D Ä D%c                 óŽ  — | j                   j                  dd«       	 | j                  j                  «       }| j                   j                  dd|d   › �«       | j                   j                  dd|d   › �«       | j                   j                  dd|d   › d	|d
   › d�«       | j                   j                  dd|d   › d	|d   › d�«       |j	                  dd«      dkD  r6| j                   j                  dd|d   › d	|j	                  dd«      › d�«       |d   rU| j                   j                  dd|d   › �«       |d   D ]+  }| j                   j                  dd|d   › d|d   › d�«       Œ- |d   r‘| j                   j                  dd«       |d   dd D ]*  }| j                   j                  dd|d   › d|d   › �«       Œ, t        |d   «      dkD  r/| j                   j                  ddt        |d   «      dz
  › d �«       |j	                  d!«      r‘| j                   j                  dd"«       |d!   dd D ]*  }| j                   j                  dd|d   › d|d   › �«       Œ, t        |d!   «      dkD  r/| j                   j                  ddt        |d!   «      dz
  › d �«       |d#   ra| j                   j                  dd$|d%   › �«       |d#   D ]6  }| j                   j                  dd|d   › d|d   › d&|d'   › d(|d)   › �«       Œ8 yy# t        $ r)}| j                   j                  dd*|› �«       Y d}~yd}~ww xY w)+z!Generate endpoint coverage reportr$   z&Generating endpoint coverage report...zTotal backend endpoints: Útotal_backend_endpointszTotal frontend calls: Útotal_frontend_callszCovered endpoints: Úcovered_countz (Úcovered_percentagez%)zUnused endpoints: Úunused_countÚunused_percentageÚintentionally_unused_countr   z!Intentionally unused (internal): Úintentionally_unused_percentageÚnew_endpointszNew endpoints detected: Únew_endpoints_countz  - Úmethodú Úpathz (new)Úunused_endpointsz&Unused endpoints (may be intentional):Né   z
  ... and z moreÚintentionally_unused_endpointsz)Intentionally unused (internal features):Úmissing_endpointszMissing backend endpoints: Úmissing_countz called from Úfileú:Úlinez-Failed to generate endpoint coverage report: )	r   r<   r   Ú!generate_endpoint_coverage_reportrG   Úlenrl   rg   r@   )r   Úcoverage_reportrz   rj   s       r   r4   z+APITests._generate_endpoint_coverage_reportà  s6  € à�‰×Ñ˜Ð HÔIð$	ZØ"×/Ñ/×QÑQÓSˆOà�K‰K×Ñ˜UÐ&?ÀÐPiÑ@jÐ?kÐ$lÔmØ�K‰K×Ñ˜UÐ&<¸_ÐMcÑ=dÐ<eÐ$fÔgØ�K‰K×Ñ˜UÐ&9¸/È/Ñ:ZÐ9[Ð[]Ð^mð  oCñ  _Dð  ^Eð  EGð  %Hô  IØ�K‰K×Ñ˜UÐ&8¸ÈÑ9XÐ8YÐY[Ð\kÐlñ  ]Að  \Bð  BDð  %Eô  Fà×"Ñ"Ð#?ÀÓCÀaÒGØ—‘× Ñ  Ð*KÈOÐ\xÑLyÐKzÐz|ð  ~M÷  ~Qñ  ~Qð  Rsð  uvó  ~wð  }xð  xzð  ){ô  |à˜Ò/Ø—‘× Ñ  Ð*BÀ?ÐShÑCiÐBjÐ(kÔlØ /°Ñ @ò b�HØ—K‘K×$Ñ$ U¨d°8¸HÑ3EÐ2FÀaÈÐQWÑHXÐGYÐY_Ð,`Õaðbð Ð1Ò2Ø—‘× Ñ  Ð*PÔRØ /Ð0BÑ CÀBÀQÐ Gò \�HØ—K‘K×$Ñ$ U¨d°8¸HÑ3EÐ2FÀaÈÐQWÑHXÐGYÐ,ZÕ[ð\ä�Ð'9Ñ:Ó;¸aÒ?Ø—K‘K×$Ñ$ U¨j¼¸_ÐM_Ñ=`Ó9aÐdeÑ9eÐ8fÐfkÐ,lÔmà×"Ñ"Ð#CÔDØ—‘× Ñ  Ð*SÔUØ /Ð0PÑ QÐRTÐSTÐ Uò \�HØ—K‘K×$Ñ$ U¨d°8¸HÑ3EÐ2FÀaÈÐQWÑHXÐGYÐ,ZÕ[ð\ä�Ð'GÑHÓIÈAÒMØ—K‘K×$Ñ$ U¨j¼¸_ÐMmÑ=nÓ9oÐrsÑ9sÐ8tÐtyÐ,zÔ{àÐ2Ò3Ø—‘×#Ñ# EÐ-HÈÐYhÑIiÐHjÐ+kÔlØ /Ð0CÑ Dò Q�HØ—K‘K×'Ñ'¨°°h¸xÑ6HÐ5IÈÈ8ÐTZÑK[ÐJ\Ð\iÐjrÐsyÑjzÐi{Ð{|ð  ~Fð  GMñ  ~Nð  }Oð  0Põ  QñQð 4øô
 ò 	ZØ�K‰K×Ñ˜eÐ'TÐUVÐTWÐ%X×YÑYûð	Zús   žK2L Ì	MÌL?Ì?Mc                 ó�  — | j                   j                  dd«       	 ddlm}  |t        «      j
                  j
                  j
                  }|dz  }|j                  «       s| j                   j                  dd«       yt        |dd	¬
«      5 }|j                  «       }ddd«       dddfi}ddddœ}| j                  j                  d||¬«      \  }}	}
|�rî|	dv �ré|
j                  d«      }|
j                  d«      }|
j                  d«      }| j                   j                  dd|› �«       | j                   j                  dd|› �«       | j                   j                  dd|› �«       |dk(  r| j                   j                  dd«       n`|dk(  r<|r| j                   j                  dd«       n<| j                   j                  dd«       n| j                   j                  dd |› �«       | j                  j                  d!|› �«      \  }}	}
|�r±|	d"k(  �r«|
}| j                   j                  dd#«       | j                   j                  dd$|j                  d%«      › �«       | j                   j                  dd|j                  d«      › �«       | j                   j                  dd|j                  d«      › �«       | j                   j                  dd&|j                  d'«      › �«       | j                   j                  dd(|j                  d)«      › d*�«       | j                   j                  dd+|j                  d,«      › �«       | j                   j                  dd-|j                  d.«      › �«       |j                  d'«      r| j                   j                  dd/«       y| j                   j                  dd0«       y| j                   j                  dd1|	› �«       | j                   j                  dd2|
› �«       y# 1 sw Y   �ŒixY w# t        $ r)}| j                   j                  dd3|› �«       Y d}~yd}~ww xY w)4z(Test manual stream import with chat.jsonr$   z'Testing manual import with chat.json...r   r   z	chat.jsonz1chat.json not found - skipping manual import testTÚrzutf-8)ÚencodingNÚchat_json_filezapplication/jsonzTest Stream from chat.jsonz!Test import with Factor_KS streamF)ÚtitleÚdescriptionÚ	is_publicz/api/streams/manual)ÚdataÚfiles)rD   r:   rF   ÚstatusÚhls_pathzManual import successful: z  - Status: z  - HLS Path: Úreadyu     âœ“ Stream is readyÚpendingu:     âš  Stream is pending but has HLS path - should be readyu%     âš  Stream is pending (no HLS path)u     âš  Stream status: z/api/streams/rD   zStream details verified:z  - Title: rª   z  - Thumbnail URL: Úthumbnail_urlz  - Duration: Úduration_secondsÚsz  - Streamer: Ústreamerz  - Twitch VOD ID: Útwitch_vod_idu     âœ“ Twitch thumbnail URL setu     âš  Thumbnail URL not setzManual import failed: z
Response: zManual import test crashed: )r   r<   rŠ   r   r   r   Úexistsrl   ÚopenÚreadr   Úpost_with_filesrG   r5   r@   rg   )r   r   r‹   Úchat_json_pathÚfÚchat_json_contentr®   r­   r5   rA   rB   Ú	stream_idÚstream_statusÚstream_hls_pathÚstream_detailsrj   s                   r   r3   zAPITests._test_manual_import  sý  € à�‰×Ñ˜Ð IÔJðL	Ý$Ù¤›>×0Ñ0×7Ñ7×>Ñ>ˆLØ)¨KÑ7ˆNà!×(Ñ(Ô*Ø—‘×#Ñ# EÐ+^Ô_Øô �n c°GÔ<ð -ÀØ$%§F¡F£HÐ!÷-ð
 ! ;Ð0AÐCUÐ"VðˆEð 6ØBØ"ñˆDð .2¯_©_×-LÑ-LØ%ØØð .Mó .Ñ*ˆG�[ (ò ˜;¨*Ò4Ø$ŸL™L¨Ó.�	Ø (§¡¨XÓ 6�Ø"*§,¡,¨zÓ":�à—‘×#Ñ# EÐ-GÈ	À{Ð+SÔTØ—‘× Ñ  ¨,°}°oÐ(FÔGØ—‘× Ñ  ¨.¸Ð8IÐ(JÔKð ! GÒ+Ø—K‘K×'Ñ'¨Ð/FÕGØ" iÒ/Ù&ØŸ™×+Ñ+¨EÐ3oÕpàŸ™×(Ñ(¨Ð0WÕXà—K‘K×'Ñ'¨Ð1FÀ}ÀoÐ/VÔWð 26·±×1DÑ1DÀ}ÐU^ÐT_ÐE`Ó1aÑ.�˜ hÚ˜{¨cÓ1Ø%-�NØ—K‘K×$Ñ$ UÐ,FÔGØ—K‘K×$Ñ$ U¨k¸.×:LÑ:LÈWÓ:UÐ9VÐ,WÔXØ—K‘K×$Ñ$ U¨l¸>×;MÑ;MÈhÓ;WÐ:XÐ,YÔZØ—K‘K×$Ñ$ U¨n¸^×=OÑ=OÐPZÓ=[Ð<\Ð,]Ô^Ø—K‘K×$Ñ$ UÐ.AÀ.×BTÑBTÐUdÓBeÐAfÐ,gÔhØ—K‘K×$Ñ$ U¨n¸^×=OÑ=OÐPbÓ=cÐ<dÐdeÐ,fÔgØ—K‘K×$Ñ$ U¨n¸^×=OÑ=OÐPZÓ=[Ð<\Ð,]Ô^Ø—K‘K×$Ñ$ UÐ.AÀ.×BTÑBTÐUdÓBeÐAfÐ,gÔhð &×)Ñ)¨/Ô:ØŸ™×+Ñ+¨EÐ3SÔTð ð Ÿ™×+Ñ+¨EÐ3PÔQàà—‘×!Ñ! %Ð+AÀ+ÀÐ)OÔPØ—‘×!Ñ! %¨:°h°ZÐ)@ÔAØ÷}-ñ -ûô@ ò 	Ø�K‰K×Ñ˜eÐ'CÀAÀ3Ð%GÔHÜûð	úsC   žA!P Â P ÂPÂL
P Î*P Ï>P ÐPÐP Ð	QÐQ Ñ Q)zhttp://localhost:8000N)T)r"   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úboolr6   r&   r>   r?   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   rŒ   r4   r3   © r    r   r   r      s  „ Ù ñ+˜vð +°ð +Ð]`ó +ñ@ dð @°dó @ðD ¨$ð  °4ó  ðD˜Tó ð6* Dó *ðX dó ð*
 tó 
ð ¨ó  ðD¨ó ð* Tó ð ¨$ó ð¨tó ð dó ð> tó ð ¨ó ð  dó ð8¨Tó ò8_ó>(ZðVP Tô Pr    r   )rÆ   ÚosÚsysrŠ   r   Útypingr   r   r   Útests.utils.loggerr   Útests.utils.http_utilsr	   Útests.utils.api_analyzerr
   r   rÈ   r    r   ú<module>rÏ      s0   ðñó 
Û 
Ý ß 'Ñ 'Ý %Ý ,Ý 0÷N	ò N	r    