Files
invest-copilot/src/backend/tests/__pycache__/test_alerts.cpython-314-pytest-9.0.3.pyc
T

282 lines
48 KiB
Plaintext
Raw Normal View History

2026-05-30 11:28:59 -04:00
+
Y´jr9có�€Rt^RIt^RIHuHt^RIt!RR4t!RR4t !RR4t
!RR 4t !R
R 4t R#) zTests for alert endpoints.NcóZa€]tRt^toRtRtRtRtRtRt Rt
Rt R t R
t
R tVtR #)
Ú
TestAlertCRUDz Tests for alert CRUD operations.c� óĽ "€RRVR, 2/pVPRRVR,RRR R
R R R
RRRRRR//VR7GRjx€L
pVPp^ÉqvV8Hq�'gÇ\P!R%V3R&Wg34RR\P
!49g\P !V4'd\P!V4MRR\P!V4R\P!V4/,p RRV /,p
\\P!V
44hR;p;r‡VP4p V R,p RqŚV8HqÝ'gy\P!R%V
3R'WČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR;p ;rŘV R ,p R
qŚV8HqÝ'gy\P!R%V
3R'WČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR;p ;rŘV R
,p RqŚV8HqÝ'gy\P!R%V
3R'WČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR;p ;rŘV R ,p R!qŚV8HqÝ'gy\P!R%V
3R'WČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR;p ;rŘV R,p RqŚV8HqÝ'gy\P!R%V
3R'WČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR;p ;rŘRqĚV 9qÝ'g±\P!R(V
3R)WË34R\P!V 4R"R#\P
!49g\P !V 4'd\P!V 4MR#/,pR$RV/,p \\P!V 44hR;rÍR#ELš5i)*zUser can create an alert.Ú
AuthorizationúBearer Útokenú/api/v1/alertsÚ watchlist_idÚidÚtypeÚpriceÚ trigger_typeÚ price_aboveÚmessagezPrice crossed above targetÚseverityÚwarningÚtickerÚAAPLÚmetadataÚ thresholdçŔb@©ÚjsonÚheadersNÚpy0ÚresponseÚpy2Úpy5úassert %(py7)sÚpy7Úpy1Úpy4úassert %(py6)sÚpy6ÚstatusÚactiveÚpy3Údataúassert %(py5)s©ú==©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)s©z%(py1)s == %(py4)s©Úin©z%(py1)s in %(py3)s© ÚpostÚ status_codeÚ
@pytest_arÚ_call_reprcompareÚ @py_builtinsÚlocalsÚ_should_repr_global_nameÚ _safereprÚAssertionErrorÚ_format_explanationr)ÚselfÚclientÚ test_userÚ watchlistrrÚ @py_assert1Ú @py_assert4Ú @py_assert3Ú @py_format6Ú @py_format8r&Ú @py_assert0Ú @py_assert2Ú @py_format5Ú @py_format7Ú @py_format4s&&&& ÚM/home/laptran/ai-env/projects/invest-copilot/src/backend/tests/test_alerts.pyÚtest_create_alertÚTestAlertCRUD.test_create_alert séé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Řź™Đ%5Ř �I dťOŘ �GŘ �MŘ Đ3Ř � Ř �fŘ � eĐ,đ=
đđ%ó÷�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�FŤ|Đ&�wĐ&�wŃ&×&×&×&Ó&�|×&×&Ő&�|×&×&Ô&�w×&×&×&×&×&×&×&Ň&Ř�NŐ#Đ4 }Đ4 }Ń4×4×4×4Ó4Đ#×4×4Ő4Đ#×4×4Ô4 }×4×4×4×4×4×4×4Ň4Ř�JŐĐ, 9Đ, 9Ń,×,×,×,Ó,Đ×,×,Ő,Đ×,×,Ô, 9×,×,×,×,×,×,×,Ň,Ř�HŤ~Đ) Đ) Ń)×)×)×)Ó)�~×)×)Ő)�~×)×)Ô) ×)×)×)×)×)×)×)Ň)Ř�HŤ~Đ' Đ' Ń'×'×'×'Ó'�~×'×'Ő'�~×'×'Ô' ×'×'×'×'×'×'×'Ň'ŘĐ�t‰|×××Ó�t××Ő�t×××××Ö�t×××Ň�t×××××××Ôň!ůs‚=SżSÁA-SÂ.OSŇ ASc � ó¶"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
pVPp^ÉqvV8Hq�'gÇ\P!RV3RWg34R
R\P
!49g\P !V4'd\P!V4MRR\P!V4R\P!V4/,p RRV /,p
\\P!V
44hR ;p;r‡VP4p V R,p RqŚV8HqÝ'gy\P!RV
3RWČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR ;p ;rŘV R,p RqŚV8HqÝ'gy\P!RV
3RWČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR ;p ;rŘR #EL!5i)z*Create alert with minimal required fields.rrrrrr r
Ú sentimentrzSentiment alertrNrrrrrrrr r!r"rÚinfor(r*r+r/©r:r;r<r=rrr>r?r@rArBr&rCrDrErFs&&&& rHÚtest_create_alert_minimalÚ'TestAlertCRUD.test_create_alert_minimals€é€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Řź™Đ%5Ř �I dťOŘ �KŘ Đ(đ=
đđ %ó÷�đ
×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�FŤ|Đ*�{Đ*�{Ń*×*×*×*Ó*�|×*×*Ő*�|×*×*Ô*�{×*×*×*×*×*×*×*Ň*Ř�JŐĐ) 6Đ) 6Ń)×)×)×)Ó)Đ×)×)Ő)Đ×)×)Ô) 6×)×)×)×)×)×)×)Ô)ňůs‚3IµI¶A-IÂ$F3Ic � óZ"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
VPRRVR,RR
R R/VR 7GR jx€L
VPRVR, R2VR7GR jx€L
pVPp^ČqvV8Hq�'gÇ\P!R!V3R"Wg34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p RRV /,p
\\P!V
44hR ;p;r‡VP4p V R,p ^qŚV8¬qÝ'gy\P!R#V
3R$WČ34R\P!V 4R\P!V4/,pRRV/,p\\P!V44hR ;p ;rŘV R,p\V4p^pVV8¬pV'gć\P!R#V3R%VV34RR\
P !49g!\P!\4'd\P!\4MRR\P!V4R\P!V4R\P!V4/,p
RR V
/,p\\P!V44hR ;p;p;ppR #ELíELÇEL¤5i)&z#User can retrieve all their alerts.rrrrrr r
r rzAlert 1rNrLzAlert 2ú/api/v1/alerts?watchlist_id=ú&status=active)rrrrrrrÚtotalrr r!r"ÚalertsÚlenúassert %(py9)sÚpy9r(r*©ú>=©z%(py1)s >= %(py4)s©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)s©
r0Úgetr1r2r3r4r5r6r7r8r9rrV)r:r;r<r=rrr>r?r@rArBr&rCrDrErFÚ @py_assert6Ú @py_assert5Ú @py_format10s&&&& rHÚtest_get_all_alertsÚ!TestAlertCRUD.test_get_all_alerts+s2é€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�ŕŹk‰kĐ*Ř �I dťOŘ �GŘ �yđ2
đđ ó÷ đ đ
Źk‰kĐ*Ř �I dťOŘ �KŘ �yđ2
đđ ó÷ đ đ  ź™Ř*¨9°T­?Đ*;¸>Đ JŘđ$ó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�GŤ}Đ! Đ! Ń!×!×!×!Ó!�}×!×!Ő!�}×!×!Ô! ×!×!×!×!×!×!×!Ň!Ř�•>Đ'Śs�>Ó"Đ' aĐ'Đ" aŃ'×'×'×'Ô'Đ" a×'×'×'×'×'×'Śs×'×'×'Ň'Śs×'×'Ö'�>×'×'Ô'Đ"×'×'Ô' a×'×'×'×'×'×'×'×'ň% ň
 ň 
ůsB‚3L+µL"¶(L+ÁL%Á%L+ÂL(ÂA-L+Ă3FL+Ę BL+Ě%L+Ě(L+c � óŠ"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
pVP4R,pVPR
V 24GR jx€L
pVPp^Čq�V 8HqŞ'gÇ\P
!RV
3RW‰34RR\ P!49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR ;p;r©VP4p
V
R ,pR
q®V
8Hq˙'gy\P
!RV3RWę34R\P!V4R\P!V
4/,pRRV/,p\\P!V44hR ;p;rúV
R,qîV8Hq˙'g±\P
!RV3RWć34R\P!V4RR\ P!49g\P!V4'd\P!V4MR/,pRRV/,p \\P!V 44hR ;rďR #EL�ELX5i)z$User can get a specific alert by ID.rrrrrr r
r rz Unique AlertrNú/api/v1/alerts/rrrrrrrr r!r"r%Úalert_idr'r(r*r+©z%(py1)s == %(py3)s) r0rr^r1r2r3r4r5r6r7r8r9©r:r;r<r=rÚ create_resprfrr>r?r@rArBr&rCrDrErFrGs&&&& rHÚtest_get_alert_by_idÚ"TestAlertCRUD.test_get_alert_by_idCsŔé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Ř"źK™KĐ(8Ř �I dťOŘ �GŘ �~đ@
đđ (ó÷� đ
×#Ń#Ó% dŐ+�ŕź™ o°h°ZĐ$@ÓA×A�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�IŤĐ0 .Đ0 .Ń0×0×0×0Ó0�×0×0Ő0�×0×0Ô0 .×0×0×0×0×0×0×0Ň0Ř�DŤzĐ%�XŃ%×%×%×%Ó%�z×%×%Ő%�z×%×%×%×%×%Ö%�X×%×%×%Ň%�X×%×%×%×%×%×%×%Ô%ňňBůs0‚3KµJ=¶2KÁ(KÁ)A-KĂFKÉ/AKËKc � óĐ"€VPR4GRjx€L
pVPpRqCV8HqU'gÇ\P!RV3RW434RR\P
!49g\P !V4'd\P!V4MRR\P!V4R\P!V4/,pRR V/,p\\P!V44hR;p;rTR
q‚P4R ,qUPq™!4q¨V
9q»'gĄ\P!RV 3RWŠ34R \P!V4R
\P!V4R\P!V 4R\P!V
4/,p RRV /,p
\\P!V
44hR;p;p ;p;ršR#ELĚ5i)z)Requesting nonexistent alert returns 404.ú$00000000-0000-0000-0000-000000000000Né”rrrrrrú not foundÚdetailrr r"Úpy8úassert %(py10)sÚpy10r(r*r,©zD%(py1)s in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.lower
}()
}) r^r1r2r3r4r5r6r7r8r9rÚlower©r:r;rr>r?r@rArBrCr`Ú @py_assert7rDÚ @py_format9Ú @py_format11s&& rHÚtest_get_nonexistent_alertÚ(TestAlertCRUD.test_get_nonexistent_alertSsé€ŕź™Đ$JÓK×K�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘĐ?źm™m›o¨hŐ7Đ?×=Ń=Đ?Đ=Ó?Đ?Đ?Ń?×?×?×?Ó?�{×?×?Ő?�{×?×?Ô?Đ7×?×?Ô?Đ=×?×?Ô?Đ?×?×?×?×?×?×?×?×?Đ?ňLůó‚G&—G#�A-G&ÂEG&c � ó2"€RRVR, 2/pVPRRVR,RRR R
R R /VR
7GRjx€L
pVP4R,pVPRV 2R RR R/R7GRjx€L
pVPp^Čq�V 8HqŞ'gÇ\P
!RV
3RW‰34RR\ P!49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR;p;r©VP4p
V
R ,pRq®V
8Hq˙'gy\P
!RV3RWę34R\P!V4R\P!V
4/,pRRV/,p\\P!V44hR;p;rúV
R ,pRq®V
8Hq˙'gy\P
!RV3RWę34R\P!V4R\P!V
4/,pRRV/,p\\P!V44hR;p;rúR#ELZEL$5i) zUser can update an alert.rrrrrr r
r rú Old MessagerrMrNrez New MessageÚcritical©rrrrrrrrr r!r"r(r*r+© r0rÚputr1r2r3r4r5r6r7r8r9©r:r;r<r=rrirfrr>r?r@rArBr&rCrDrErFs&&&& rHÚtest_update_alertÚTestAlertCRUD.test_update_alertYsÍé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Ř"źK™KĐ(8Ř �I dťOŘ �GŘ �}Ř �đ @
đ
đ (ó÷� đ ×#Ń#Ó% dŐ+�ŕź™Ř�h�ZĐ (Ř�]¨J¸
ĐCđ$ó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�IŤĐ/ -Đ/ -Ń/×/×/×/Ó/�×/×/Ő/�×/×/Ô/ -×/×/×/×/×/×/×/Ň/Ř�JŐĐ- :Đ- :Ń-×-×-×-Ó-Đ×-×-Ő-Đ×-×-Ô- :×-×-×-×-×-×-×-Ô-ňň
ůs)‚5J·J¸8JÁ0JÁ1A-JĂF3JĘJc � ó."€RRVR, 2/pVPRRVR,RRR R
R R /VR
7GRjx€L
pVP4R,pVPRV 2R R/R7GRjx€L
pVPp^Čq�V 8HqŞ'gÇ\P
!RV
3RW‰34RR\ P!49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR;p;r©VP4p
V
R ,pRq®V
8Hq˙'gy\P
!RV3RWę34R\P!V4R\P!V
4/,pRRV/,p\\P!V44hR;p;rúV
R ,pR q®V
8Hq˙'gy\P
!RV3RWę34R\P!V4R\P!V
4/,pRRV/,p\\P!V44hR;p;rúR#ELXEL$5i)z0Update only message, leaving severity unchanged.rrrrrr r
r rr~rrrNrezUpdated Messager€rrrrrrrr r!r"r(r*r+r�r�s&&&& rHÚtest_update_alert_partialÚ'TestAlertCRUD.test_update_alert_partialmsÍé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Ř"źK™KĐ(8Ř �I dťOŘ �GŘ �}Ř � đ @
đ
đ (ó÷� đ ×#Ń#Ó% dŐ+�ŕź™Ř�h�ZĐ (ŘĐ.Đ/đ$ó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�IŤĐ3Đ"3Đ3Đ"3Ń3×3×3×3Ó3�×3×3Ő3�×3×3Ô3Đ"3×3×3×3×3×3×3×3Ň3Ř�JŐĐ, 9Đ, 9Ń,×,×,×,Ó,Đ×,×,Ő,Đ×,×,Ô, 9×,×,×,×,×,×,×,Ô,ňň
ůs)‚5J·J¸6JÁ.JÁ/A-JĂF3JĘJc � óŘ"€VPRRR/R7GRjx€L
pVPpRqCV8HqU'gÇ\P!RV3RW434RR\P
!49g\P !V4'd\P!V4MRR \P!V4R
\P!V4/,pR R V/,p\\P!V44hR;p;rTR
q‚P4R,qUPq™!4q¨V
9q»'gĄ\P!RV 3RWŠ34R\P!V4R\P!V4R\P!V 4R\P!V
4/,p RRV /,p
\\P!V
44hR;p;p ;p;ršR#ELĚ5i)z%Update nonexistent alert returns 404.rmrÚNoper€Nrnrrrrrrrorprr r"rqrrrsr(r*r,rt) r‚r1r2r3r4r5r6r7r8r9rrurvs&& rHÚtest_update_nonexistent_alertÚ+TestAlertCRUD.test_update_nonexistent_alert�s)é€ŕź™Ř 2Ř�VĐ$đ$ó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘĐ?źm™m›o¨hŐ7Đ?×=Ń=Đ?Đ=Ó?Đ?Đ?Ń?×?×?×?Ó?�{×?×?Ő?�{×?×?Ô?Đ7×?×?Ô?Đ=×?×?Ô?Đ?×?×?×?×?×?×?×?×?Đ?ň 
ůs‚G*›G'śA-G*Â
EG*c � óş"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
pVP4R,pVPR
V 24GR jx€L
pVPp^Ěq�V 8HqŞ'gÇ\P
!RV
3RW‰34RR\ P!49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR ;p;r©VPR
V 24GR jx€L
pVPpRq�V 8HqŞ'gÇ\P
!RV
3RW‰34RR\ P!49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR ;p;r©R #ELELîLđ5i)zUser can delete an alert.rrrrrr r
r rz Delete MerNrerrrrrrrnr(r*)
r0rÚdeleter1r2r3r4r5r6r7r8r9r^©
r:r;r<r=rrirfrr>r?r@rArBs
&&&& rHÚtest_delete_alertÚTestAlertCRUD.test_delete_alertŠs™é€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Ř"źK™KĐ(8Ř �I dťOŘ �GŘ �{đ@
đđ (ó÷� đ
×#Ń#Ó% dŐ+�ŕź™¨¸¸
Đ'CÓD×D�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*đ ź™ o°h°ZĐ$@ÓA×A�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ô*ňňEńBůsC‚3IµI¶2IÁ(IÁ)A-IĂBIĹ(IĹ)A-IÇA=IÉIÉI©N)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú__doc__rIrOrbrjrzr„r‡r‹r�Ú__static_attributes__Ú__classdictcell__©Ú
__classdict__s@rHrrs<ř‡€Ů*ňň* *ň(ň0&ň @ň .ň(-ň(@÷+đ+órcó0a€]tRt^śtoRtRtRtRtVtR#)ÚTestAlertResolvez!Tests for alert resolve endpoint.c � ó~"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
pVP4R,pVPR
V R24GR jx€L
pVPp^Čq�V 8HqŞ'gÇ\P!RV
3R W‰34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR ;p;r©VP4p
V
R,pRq®V
8Hq˙'gy\P!RV3R!Wę34R\P!V4R\P!V
4/,pRRV/,p\\P!V44hR ;p;rúRqîV
9q˙'g±\P!R"V3R#Wí34R\P!V4RR\
P !49g\P!V
4'd\P!V
4MR/,pRRV/,p \\P!V 44hR ;rďR #EL‚ELQ5i)$zUser can resolve an alert.rrrrrr r
r rz
Resolve MerNrez/resolverrrrrrr#Úresolvedrr r!r"Ú resolved_atr%r&r'r(r*r+r,r.) r0rr1r2r3r4r5r6r7r8r9rhs&&&& rHÚtest_resolve_alertÚ#TestAlertResolve.test_resolve_alertźsľé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Ř"źK™KĐ(8Ř �I dťOŘ �GŘ �|đ@
đđ (ó÷� đ
×#Ń#Ó% dŐ+�ŕź™ °x°jŔĐ%IÓJ×J�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�HŤ~Đ+ Đ+ Ń+×+×+×+Ó+�~×+×+Ő+�~×+×+Ô+ ×+×+×+×+×+×+×+Ň+ŘĐ$ Ń$×$×$×$Ó$�}×$×$Ő$�}×$×$×$×$×$Ö$ ×$×$×$Ň$ ×$×$×$×$×$×$×$Ô$ňňKůs0‚3J=µJ7¶3J=Á)J:Á*A-J=ĂFJ=É)AJ=Ę:J=c � óĐ"€VPR4GRjx€L
pVPpRqCV8HqU'gÇ\P!RV3RW434RR\P
!49g\P !V4'd\P!V4MRR\P!V4R\P!V4/,pRR V/,p\\P!V44hR;p;rTR
q‚P4R ,qUPq™!4q¨V
9q»'gĄ\P!RV 3RWŠ34R \P!V4R
\P!V4R\P!V 4R\P!V
4/,p RRV /,p
\\P!V
44hR;p;p ;p;ršR#ELĚ5i)z&Resolve nonexistent alert returns 404.z,00000000-0000-0000-0000-000000000000/resolveNrnrrrrrrrorprr r"rqrrrsr(r*r,rt) r0r1r2r3r4r5r6r7r8r9rrurvs&& rHÚtest_resolve_nonexistent_alertÚ/TestAlertResolve.test_resolve_nonexistent_alertŻsé€ŕź™Ř :ó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘĐ?źm™m›o¨hŐ7Đ?×=Ń=Đ?Đ=Ó?Đ?Đ?Ń?×?×?×?Ó?�{×?×?Ő?�{×?×?Ô?Đ7×?×?Ô?Đ=×?×?Ô?Đ?×?×?×?×?×?×?×?×?Đ?ň 
ůr|r’N) r“r”r•r–r—r˘rĄr�r™ršs@rHržržśsř‡€Ů+ň%÷ @đ@rśržcó0a€]tRt^¸toRtRtRtRtVtR#)ÚTestAlertDismissz!Tests for alert dismiss endpoint.c � óĽ"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
pVP4R,pVPR
V R24GR jx€L
pVPp^Ěq�V 8HqŞ'gÇ\P!RV
3RW‰34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR ;p;r©VPR
V 24GR jx€L
pVPpRq�V 8HqŞ'gÇ\P!RV
3RW‰34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V 4/,p RRV /,p \\P!V 44hR ;p;r©R #ELELîLđ5i)zUser can dismiss an alert.rrrrrr r
r rz
Dismiss MerNrez/dismissrrrrrrrnr(r*) r0rr1r2r3r4r5r6r7r8r9r^rŹs
&&&& rHÚtest_dismiss_alertÚ#TestAlertDismiss.test_dismiss_alert»s›é€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�Ř"źK™KĐ(8Ř �I dťOŘ �GŘ �|đ@
đđ (ó÷� đ
×#Ń#Ó% dŐ+�ŕź™ °x°jŔĐ%IÓJ×J�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*đ ź™ o°h°ZĐ$@ÓA×A�Ř×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ô*ňňKńBůsC‚3IµI¶3IÁ)IÁ*A-IĂBIĹ)IĹ*A-IÇA=IÉIÉIc � ó "€VPR4GRjx€L
pVPp^ĚqCV8HqU'gÇ\P!R V3R
W434RR\P
!49g\P !V4'd\P!V4MRR\P!V4R\P!V4/,pRRV/,p\\P!V44hR;p;rTR#Lę5i) z3Dismiss nonexistent alert returns 204 (idempotent).z,00000000-0000-0000-0000-000000000000/dismissNrrrrrrr(r*©
r0r1r2r3r4r5r6r7r8r9)r:r;rr>r?r@rArBs&& rHÚtest_dismiss_nonexistent_alertÚ/TestAlertDismiss.test_dismiss_nonexistent_alertĚs�é€ŕź™Ř :ó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ô*ń
ůs‚D—D�A-DÂA=Dr’N) r“r”r•r–r—rŞr®r�r™ršs@rHr¨r¨¸sř‡€Ů+ň+÷"+đ+rśr¨có<a€]tRt^ÔtoRtRtRtRtRtRt Vt
R#)ÚTestAlertFiltersz$Tests for alert filtering endpoints.c � ó("€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
VPRRVR,RR
R R/VR 7GR jx€L
VPRVR, R24GR jx€L
pVPp^ČqvV8Hq�'gÇ\P!RV3RWg34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p RRV /,p
\\P!V
44hR ;p;r‡VP4p V R,p\V4p^qČV 8¬qÝ'gĺ\P!RV
3RWŚ34RR\
P !49g!\P!\4'd\P!\4MRR\P!V4R\P!V4R\P!V 4/,p
RRV
/,p\\P!V44hR ;p;p;rÜR #ELTEL.EL
5i) z!User can filter alerts by status.rrrrrr r
r rz Active AlertrNrLzActive Alert 2rRrSrrrrrrrUrVr rWrXr(r*rYr\r])r:r;r<r=rrr>r?r@rArBr&r_r`ras&&&& rHÚtest_filter_alerts_by_statusÚ-TestAlertFilters.test_filter_alerts_by_status×sÖé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�ŕŹk‰kĐ*Ř �I dťOŘ �GŘ �~đ2
đđ ó÷ đ đ
Źk‰kĐ*Ř �I dťOŘ �KŘ Đ'đ2
đđ ó÷ đ đ  ź™Ř*¨9°T­?Đ*;¸>Đ Jó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�Ř�•>Đ'Śs�>Ó"Đ' aĐ' aŃ'×'×'×'Ó'Đ"×'×'×'×'×'×'Śs×'×'×'Ň'Śs×'×'Ö'�>×'×'Ô'Đ"×'×'Ô' a×'×'×'×'×'×'×'Ö'ň! ň
 ň 
ůsB‚3JµJ ¶(JÁJ Á#JÂJÂA-JĂ1C?JÇ1BJĘ JĘJc � óš"€RRVR, 2/pVPRRVR,RRR R
R R /VR
7GRjx€L
VPRVR, R24GRjx€L
pVPp^ČqvV8Hq�'gÇ\P!RV3RWg34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p RRV /,p
\\P!V
44hR;p;r‡R#ELLí5i)z#User can filter alerts by severity.rrrrrr r
r rz
Warning AlertrrrNrRrSrrrrrrr(r*) r0r^r1r2r3r4r5r6r7r8r9© r:r;r<r=rrr>r?r@rArBs &&&& rHÚtest_filter_alerts_by_severityÚ/TestAlertFilters.test_filter_alerts_by_severityísé€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�ŘŹk‰kĐ*Ř �I dťOŘ �GŘ �Ř � đ 2
đ
đ ó÷ đ đ ź™Ř*¨9°T­?Đ*;¸>Đ Jó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ô*ň ń
ůs)‚5E ·E¸#E ÁE ÁA-E Ă
A=E Ĺ E c � óZ"€RRVR, 2/pVPRRVR,RRR R
/VR 7GR jx€L
VPRRVR,RR
R R/VR 7GR jx€L
VPRVR, R24GR jx€L
pVPp^ČqvV8Hq�'gÇ\P!RV3RWg34RR\
P !49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p RRV /,p
\\P!V
44hR ;p;r‡VP4p V R,F�p V R,p
RR
.qŤV9qî'gy\P!RV3RWŘ34R\P!V
4R\P!V4/,pRRV/,p\\P!V44hR ;p
;rčKš R #ELíELÇEL¦5i) zUser can filter alerts by type.rrrrrr r
r rz Price AlertrNrLzSentiment AlertrRrSrrrrrrrUrr r!r"r(r*r,)z%(py1)s in %(py4)s) r0r^r1r2r3r4r5r6r7r8r9r)r:r;r<r=rrr>r?r@rArBr&ÚalertrCrDrErFs&&&& rHÚtest_filter_alerts_by_typeÚ+TestAlertFilters.test_filter_alerts_by_typeüs´é€ŕ" g¨i¸Ő.@Đ-AĐ$BĐC�ŘŹk‰kĐ*Ř �I dťOŘ �GŘ �}đ2
đđ ó÷ đ đ
Źk‰kĐ*Ř �I dťOŘ �KŘ Đ(đ2
đđ ó÷ đ đ  ź™Ř*¨9°T­?Đ*;¸>Đ Jó
÷
�đ×#Ń#Đ* sĐ* sŃ*×*×*×*Ó*Đ#×*×*×*×*×*×*�x×*×*×*Ň*�x×*×*Ö*Đ#×*×*Ô* s×*×*×*×*×*×*×*Ň*ŘŹ}‰}‹�ŕ�(—^�^�EŘ�•=Đ : W¨kĐ$:Đ :Đ$:Ń:× :× :× :Ó :�=× :× :Ő :�=× :× :Ô :Đ$:× :× :× :× :× :× :× :Ô :ó$ň# ň
 ň 
ůs;‚3H+µH"¶(H+ÁH%Á#H+ÂH(ÂA-H+Ă1D2H+Č%H+Č(H+c � ót"€RRVR, 2/p\^4F/pVPRRVR,RRR R
V 2/VR 7GR jx€L
K1 VPR
VR, R24GR jx€L
pVPp^Čq‡V8Hq™'gÇ\P
!R V 3R!Wx34RR\ P!49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p
RRV
/,p \\P!V 44hR ;p;r�VP4p V R,p
^qťV 8Hqî'gy\P