Files
weibo_signin/backend/tests/__pycache__/test_auth_service.cpython-311-pytest-8.3.3.pyc

224 lines
43 KiB
Plaintext
Raw Normal View History

2026-03-09 14:05:00 +08:00
<EFBFBD>
GW<47>i$+<00><00>&<00>dZddlZddlmcmZddlZddlZddl m
Z
m Z ddl m Z ddlmZddlmZmZddlmZmZmZmZmZddlmZdd lmZmZGd
<EFBFBD>d <0B><00>ZGd <0C>d <0A><00>ZGd<0E>d<0F><00>Z Gd<10>d<11><00>Z!Gd<12>d<13><00>Z"dS)ul
Tests for auth_service: security utils, AuthService logic, and API endpoints.
Validates tasks 2.1 2.3.
<EFBFBD>N)<02>patch<63> AsyncMock)<01> HTTPException)<01>User)<02>TestSessionLocal<61> FakeRedis)<05> hash_password<72>verify_password<72>validate_password_strength<74>create_access_token<65>decode_access_token<65><01> AuthService)<02>
UserCreate<EFBFBD> UserLoginc<00>l<00>eZdZd<01>Zd<02>Zej<00>dgd<04><01><00>d<05><00><00>Zd<06>Z dS)<08>TestPasswordUtilsc<00>L<00>d}t|<01><00>}t||<02><00>}|s<>ddtj<00><00>vst jt<00><00>rt jt<00><00>nddtj<00><00>vst j|<01><00>rt j|<01><00>nddtj<00><00>vst j|<02><00>rt j|<02><00>ndt j|<03><00>d<06>z}tt j|<04><00><00><00><00>d}dS)Nz
MyP@ssw0rdz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r
<00>raw<61>hashed)<04>py0<79>py1<79>py2<79>py4<79> r r
<00> @py_builtins<6E>locals<6C>
@pytest_ar<61>_should_repr_global_name<6D> _saferepr<70>AssertionError<6F>_format_explanation)<05>selfrr<00> @py_assert3<74> @py_format5s <20>0D:\code\weibo\backend\tests\test_auth_service.py<70>test_hash_and_verifyz&TestPasswordUtils.test_hash_and_verifys%<00><00><1A><03><1E>s<EFBFBD>#<23>#<23><06>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>c<00><00>td<01><00>}d}t||<01><00>}| }|s<>ddtj<00><00>vst jt<00><00>rt jt<00><00>ndt j|<02><00>dtj<00><00>vst j|<01><00>rt j|<01><00>ndt j|<03><00>d<06>z}tt j|<05><00><00><00><00>dx}x}}dS)Nz Correct1!zWrong1!z9assert not %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r
r)rr<00>py3<79>py5r)r#r<00> @py_assert1<74> @py_assert4<74> @py_assert6<74> @py_format7s r&<00>test_wrong_password_rejectedz.TestPasswordUtils.test_wrong_password_rejected$s<00><00><1E>{<7B>+<2B>+<2B><06>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5<>5r(zpwd, expected_valid))zAb1!abcdT)zshort1A!T)z
alllower1!F)z
ALLUPPER1!F)z NoDigits!AaF)<02> NoSpecial1aFc<00><><00>t|<01><00>\}}||k}|s<>tjd|fd||f<02><00>dtj<00><00>vstj|<03><00>rtj|<03><00>nddtj<00><00>vstj|<02><00>rtj|<02><00>ndd<05>z}dd|iz}ttj|<07><00><00><00><00>d}dS)N<><01>==)z%(py0)s == %(py2)s<>is_valid<69>expected_valid<69>rr<00>assert %(py4)sr) r r<00>_call_reprcomparerrrr r!r")r#<00>pwdr6r5<00>_r,<00> @py_format3r%s r&<00>test_password_strengthz(TestPasswordUtils.test_password_strength(s<00><00>1<><13>5<>5<> <0B><08>!<21>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)r(c<00>H<00>td<01><00>\}}| }|sedddtj<00><00>vstj|<01><00>rtj|<01><00>ndiz}t tj|<04><00><00><00><00>d}d}||v}|s<>tjd|fd||f<02><00>tj|<05><00>dtj<00><00>vstj|<02><00>rtj|<02><00>ndd <09>z}d
d |iz}t tj|<08><00><00><00><00>dx}}dS) NzAb1!zassert not %(py0)srr5z 8 characters<72><01>in<69>z%(py1)s in %(py3)s<>msg<73>rr*<00>assert %(py5)sr+) r rrrrr r!r"r9) r#r5rBr,<00> @py_format2<74> @py_assert0<74> @py_assert2<74> @py_format4<74> @py_format6s r&<00>test_password_too_shortz)TestPasswordUtils.test_password_too_short7s]<00><00>2<>6<EFBFBD>:<3A>:<3A> <0A><08>#<23><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B><1B>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$<24>$r(N)
<EFBFBD>__name__<5F>
__module__<EFBFBD> __qualname__r'r0<00>pytest<73>mark<72> parametrizer=rJ<00>r(r&rrs<><00><00><00><00><00><00>,<2C>,<2C>,<2C>
6<>6<>6<> <0C>[<5B><1C><1C><1D>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<06>
<06>*<2A>*<2A>
<06>
<06>*<2A>%<25>%<25>%<25>%<25>%r(rc<00><00>eZdZd<01>Zd<02>ZdS)<04>TestJWTc<00><><00>tddd<03><02><00>}t|<01><00>}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<02><00>rtj|<02><00>ndtj|<03><00>d<07>z}dd |iz}ttj |<06><00><00><00><00>dx}}|d
}d}||k}|sltjd |fd ||f<02><00>tj|<07><00>tj|<08><00>d <0A>z} dd| iz}
ttj |
<EFBFBD><00><00><00><00>dx}x}}dS)Nzuser-123<32>alice)<02>sub<75>username<6D><01>is not<6F>z%(py0)s is not %(py3)s<>payload<61>rr*rDr+rVr3<00>z%(py1)s == %(py4)s<>rr<00>assert %(py6)s<>py6)
r r rr9rrrr r!r") r#<00>tokenr[rGr,rHrIrFr$r%r/s r&<00>test_create_and_decodezTestJWT.test_create_and_decodeBs<><00><00>#<23>J<EFBFBD>G<EFBFBD>$L<>$L<>M<>M<><05>%<25>e<EFBFBD>,<2C>,<2C><07>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+r(c<00><><00>d}t|<01><00>}d}||u}|s<>tjd|fd||f<02><00>dtj<00><00>vstjt<00><00>rtjt<00><00>ndtj|<01><00>tj|<02><00>tj|<03><00>d<05>z}dd|iz}ttj|<06><00><00><00><00>dx}x}x}}dS)Nznot.a.valid.token<65><01>is)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr <00>rrr<00>py7<79>assert %(py9)s<>py9) r rr9rrrr r!r")r#r,r$r.<00> @py_assert5<74> @py_format8<74> @py_format10s r&<00>test_invalid_token_returns_nonez'TestJWT.test_invalid_token_returns_noneHs<00><00>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?r(N)rKrLrMrbrmrQr(r&rSrS@s7<00><00><00><00><00><00>,<2C>,<2C>,<2C> @<01>@<01>@<01>@<01>@r(rSc<00>8<00>eZdZejjd<01><00><00>ZdS)<03>TestRefreshTokenc<00><00><00>K<00><00>fd<01>}td|<02><03><00>5ddlm}m}m}|d<06><00><00>d{V<00><03>}g}t |t <00><00>}|} |rt|<06><00>}
d} |
| k} | } | <09>s$dd tj <00><00>vstj t
<00><00>rtj t
<00><00>nd d
tj <00><00>vstj |<06><00>rtj |<06><00>nd
d tj <00><00>vstj t <00><00>rtj t <00><00>nd tj |<08><00>d <0C>z} |<07> | <0A><00>|r<>tjd | fd|
| f<02><00>dtj <00><00>vstj t<00><00>rtj t<00><00>ndd
tj <00><00>vstj |<06><00>rtj |<06><00>nd
tj |
<EFBFBD><00>tj | <0B><00>d<10>z}dd|iz}|<07> |<0F><00>tj|d<04><00>iz}dd|iz}t!tj|<11><00><00><00><00>dx} x}x}x}
x} } ||<06><00><00>d{V<00><03>}d}||k}|s<>tjd|fd||f<02><00>dtj <00><00>vstj |<12><00>rtj |<12><00>ndtj |<13><00>d<18>z}dd|iz}t!tj|<15><00><00><00><00>dx}}||<06><00><00>d{V<00><03>||<06><00><00>d{V<00><03>} d}| |u}|sltjd|fd| |f<02><00>tj | <09><00>tj |<16><00>d<1D>z}dd|iz} t!tj| <0A><00><00><00><00>dx} x}}ddd<07><00>dS#1swxYwYdS) uKFull lifecycle: create → verify → revoke → verify again returns None.c<00><00> <00>K<00><00>S<00>NrQ<00><01>
fake_rediss<00>r&<00>_fake_get_rediszCTestRefreshToken.test_create_verify_revoke.<locals>._fake_get_redisU<00> <00><><00><00><00><1D> r(<00>)auth_service.app.utils.security.get_redis<69><01>newr)<03>create_refresh_token<65>verify_refresh_token<65>revoke_refresh_tokenzuser-42Nz.%(py6)s
{%(py6)s = %(py2)s(%(py3)s, %(py4)s)
}<7D>
isinstancera<00>str)rr*rr`)<01>>)z2%(py11)s
{%(py11)s = %(py8)s(%(py9)s)
} > %(py14)s<>len)<04>py8ri<00>py11<31>py14z%(py16)s<>py16zassert %(py19)s<>py19r3)z%(py0)s == %(py3)s<>uidr\rDr+rd<00>z%(py1)s is %(py4)sr^r_r`)r<00>auth_service.app.utils.securityrzr{r|r}r~r<>rrrrr <00>appendr9<00>_format_boolopr!r")r#rtrurzr{r|rar,rjrF<00> @py_assert10<31> @py_assert13<31> @py_assert12r/<00> @py_format15<31> @py_format17<31> @py_format18<31> @py_format20r<30>rGrHrIr$r%s ` r&<00>test_create_verify_revokez*TestRefreshToken.test_create_verify_revokeQs_<00><><00><00><00> <1E> <1E> <1E> <1E> <1E><13> 7<><1F>
<EFBFBD>
<EFBFBD>
<EFBFBD> =<3D> =<3D> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> /<2F>.<2E>y<EFBFBD>9<>9<>9<>9<>9<>9<>9<>9<>E<EFBFBD> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C>,<2C>,<2C>U<EFBFBD>3<>3<>3<>3<>3<>3<>3<>3<>C<EFBFBD> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23> #<23>&<26>&<26>u<EFBFBD>-<2D>-<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C># =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D> =<3D><><EFBFBD><EFBFBD> =<3D> =<3D> =<3D> =<3D> =<3D> =s<00>OO<<03><P<07>PN)rKrLrMrNrO<00>asyncior<6F>rQr(r&roroOs3<00><00><00><00><00><00> <0B>[<5B><18>=<3D>=<3D><19><18>=<3D>=<3D>=r(roc<00><><00>eZdZejd<01><00><00>Zejjd<02><00><00>Z ejjd<03><00><00>Z
ejjd<04><00><00>Z ejjd<05><00><00>Z dS)<07>TestAuthServiceLogicc<00><00>$K<00>t|<01><00>Srrr)r#<00>
db_sessions r&<00>auth_svczTestAuthServiceLogic.auth_svcqs<00><00><00><00><1A>:<3A>&<26>&<26>&r(c<00><00><>K<00>tddd<03><04><00>}|<01>|<03><00><00>d{V<00><03>}|j}d}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<05><00>tj|<06><00>d<08>z}d d
|iz} ttj
| <09><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd|fd ||f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<05><00>tj|<06><00>d<08>z}d d
|iz} ttj
| <09><00><00><00><00>dx}x}}|j }d}||k}|s<>tjd |fd ||f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<05><00>tj|<06><00>d<08>z}d d
|iz} ttj
| <09><00><00><00><00>dx}x}}dS)N<>newuserznew@example.com<6F> Str0ng!Pass<73>rW<00>email<69>passwordr3<00>z0%(py2)s
{%(py2)s = %(py0)s.username
} == %(py5)s<>user<65>rrr+<00>assert %(py7)srg)z-%(py2)s
{%(py2)s = %(py0)s.email
} == %(py5)s<><01>!=)z7%(py2)s
{%(py2)s = %(py0)s.hashed_password
} != %(py5)s) r<00> create_userrWrr9rrrr r!r"r<><00>hashed_password)
r#r<>r<><00>datar<61>r,r-r$rIrks
r&<00>test_create_user_successz-TestAuthServiceLogic.test_create_user_successus<><00><00><00><00><19>9<EFBFBD>4E<34>P]<5D>^<5E>^<5E>^<5E><04><1D>)<29>)<29>$<24>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F>/<2F><04>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4r(c<00><00><>K<00>tddd<03><04><00>}tjt<00><00>5}|<01>|<02><00><00>d{V<00><03>ddd<00><00>n #1swxYwY|j}|j}d}||k}|s<>tjd|fd||f<02><00>dtj
<00><00>vstj |<03><00>rtj |<03><00>ndtj |<04><00>tj |<05><00>tj |<06><00>d <09>z}d
d |iz} ttj| <09><00><00><00><00>dx}x}x}}dS) N<>weakuserzweak@example.com<6F> weakpasswordr<64><00><>r3)zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.status_code
} == %(py7)s<>exc_inforfrhri)rrN<00>raisesrr<><00>value<75> status_coderr9rrrr r!r")
r#r<>r<>r<>r,r$r.rjrkrls
r&<00>'test_create_user_weak_password_rejectedz<TestAuthServiceLogic.test_create_user_weak_password_rejected}s<><00><00><00><00><1A>:<3A>5G<35>R`<60>a<>a<>a<><04> <13>]<5D>=<3D> )<29> )<29> -<2D>X<EFBFBD><1A>&<26>&<26>t<EFBFBD>,<2C>,<2C> ,<2C> ,<2C> ,<2C> ,<2C> ,<2C> ,<2C> ,<2C> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D><><EFBFBD><EFBFBD> -<2D> -<2D> -<2D> -<2D>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0s<00>A<03>A<07>Ac<00><00>bK<00>tddd<03><04><00>}|<01>|<03><00><00>d{V<00><03>|<01>d<02><00><00>d{V<00><03>}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<05><00>d<08>z}d d
|iz}ttj
|<08><00><00><00><00>dx}}|j }d} || k}
|
s<EFBFBD>tjd |
fd || f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<06><00>tj| <09><00>d <0A>z}dd|iz} ttj
| <0B><00><00><00><00>dx}x}
} dS)N<>findmezfind@example.comr<6D>r<>rXrZ<00>foundr\rDr+r3r<>r<>r<>rg) rr<><00>get_user_by_emailrr9rrrr r!r"rW) r#r<>r<>r<>r<>rGr,rHrIr-r$rks r&<00>test_get_user_by_emailz+TestAuthServiceLogic.test_get_user_by_email<69>s<00><00><00><00><19>8<EFBFBD>3E<33>P]<5D>^<5E>^<5E>^<5E><04><16>"<22>"<22>4<EFBFBD>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28><1E>0<>0<>1C<31>D<>D<>D<>D<>D<>D<>D<>D<><05> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)r(c<00><00>.K<00>tddd<03><04><00>}|<01>|<03><00><00>d{V<00><03>|<01>dd<05><00><00>d{V<00><03>\}}d}||u}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<06><00>d <09>z}d
d |iz} ttj
| <09><00><00><00><00>dx}}d}||u}|s<>tjd |fd ||f<02><00>dt j<00><00>vstj|<05><00>rtj|<05><00>ndtj|<06><00>d <09>z}d
d |iz} ttj
| <09><00><00><00><00>dx}}dS)N<>existszexists@example.comr<6D>r<><00>otherrXrZ<00>email_ur\rDr+rd)z%(py0)s is %(py3)s<>
username_u) rr<><00>check_user_existsrr9rrrr r!r")
r#r<>r<>r<>r<>r<>rGr,rHrIs
r&<00>test_check_user_existsz+TestAuthServiceLogic.test_check_user_exists<74>s<00><00><00><00><19>8<EFBFBD>3G<33>R_<52>`<60>`<60>`<60><04><16>"<22>"<22>4<EFBFBD>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>$,<2C>$><3E>$><3E>?S<>U\<5C>$]<5D>$]<5D>]<5D>]<5D>]<5D>]<5D>]<5D>]<5D><1B><07><1A>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!<21>!r(N) rKrLrM<00>pytest_asyncio<69>fixturer<65>rNrOr<>r<>r<>r<>r<>rQr(r&r<>r<>os<><00><00><00><00><00><00><13><1B>'<27>'<27><1C><1B>'<27> <0C>[<5B><18>5<>5<><19><18>5<> <0C>[<5B><18>1<>1<><19><18>1<> <0C>[<5B><18>*<2A>*<2A><19><18>*<2A> <0C>[<5B><18>"<22>"<22><19><18>"<22>"<22>"r(r<>c<00><><00>eZdZdZejd<02><00><00>Zejj d<03><00><00>Z
ejj d<04><00><00>Z ejj d<05><00><00>Z ejj d<06><00><00>Z ejj d<07><00><00>Zejj d<08><00><00>Zejj d <09><00><00>Zejj d
<EFBFBD><00><00>Zd S) <0C> TestAuthAPIz4Integration tests hitting the FastAPI app via httpx.c<00>J<00><01> K<00>ddlm}ddlm}ddlm}m}ddlm}m <09> m
}|<06> <00><00>4<00>d{V<00><03>}|<08> |j j<00><00><00>d{V<00><03>ddd<06><00><00>d{V<00><03>n#1<00>d{V<00><03>swxYwY<00> fd<07>} <09>fd<08>}
| |j|<t!d |
<EFBFBD>
<EFBFBD><00>5|||<03><03><00>d <0B> <0C><00>4<00>d{V<00><03> } | WV<00>ddd<06><00><00>d{V<00><03>n#1<00>d{V<00><03>swxYwYddd<06><00>n #1swxYwY|j<00><00><00>dS) z<>
Provide an httpx AsyncClient wired to the auth_service app,
with DB session overridden to use the test SQLite engine.
r)<01>get_db)<01>app)<02> AsyncClient<6E> ASGITransport)<03> TEST_ENGINEr<00>BaseNc<00><><00>K<00><00><01><00>4<00>d{V<00><03>}|WV<00>ddd<00><00><00>d{V<00><03>dS#1<00>d{V<00><03>swxYwYdSrrrQ)<02>sessionrs <20>r&<00>override_get_dbz+TestAuthAPI.client.<locals>.override_get_db<64>s<><00><><00><00><00>'<27>'<27>)<29>)<29> <1E> <1E> <1E> <1E> <1E> <1E> <1E>W<EFBFBD><1D> <0A> <0A> <0A> <0A> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E><><EFBFBD><EFBFBD> <1E> <1E> <1E> <1E> <1E> s <00>-<03>
7<07>7c<00><00> <00>K<00><00>SrrrQrss<00>r&ruz+TestAuthAPI.client.<locals>._fake_get_redis<69>rvr(rwrxz http://test)<02> transport<72>base_url)<12> shared.modelsr<73><00>auth_service.app.mainr<6E><00>httpxr<78>r<><00>tests.conftestr<74>rr<><00>begin<69>run_sync<6E>metadata<74>
create_all<EFBFBD>dependency_overridesr<00>clear) r#rtr<>r<>r<>r<>r<>r<><00>connr<6E>ru<00>acrs ` @r&<00>clientzTestAuthAPI.client<6E>s<00><><EFBFBD><00><00><00> )<29>(<28>(<28>(<28>(<28>(<28>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>4<>4<>4<>4<>4<>4<>4<>4<>F<>F<>F<>F<>F<>F<>F<>F<>F<>F<><1E>$<24>$<24>&<26>&<26> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A>$<24><16>-<2D>-<2D><04> <0A> 8<>9<>9<> 9<> 9<> 9<> 9<> 9<> 9<> 9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD> :<3A> :<3A> :<3A> :<3A> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E> <1E>,;<3B><03> <20><16>(<28> <12> 7<><1F>
<EFBFBD>
<EFBFBD>
<EFBFBD> <19> <19>#<23>{<7B>'<27>-<2D>C<EFBFBD>0<>0<>0<>=<3D><0E><0E><0E> <19> <19> <19> <19> <19> <19> <19> <19><13><18><08><08><08><08> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19><><EFBFBD><EFBFBD> <19> <19> <19> <19>  <19> <19> <19> <19> <19> <19> <19> <19> <19> <19> <19><><EFBFBD><EFBFBD> <19> <19> <19> <19> <0C> <20>&<26>&<26>(<28>(<28>(<28>(<28>(sG<00>&A5<03>5
A?<07>A?<07>+C?<03>
C"<05>C?<03>"
C, <09>,C?<03>/C, <09>0C?<03>?D<07>Dc<00><00> K<00>|<01>ddddd<05><03><06><00><00>d{V<00><03>}|j}d}||k}|s<>tjd|fd ||f<02><00>d
t j<00><00>vstj|<02><00>rtj|<02><00>nd
tj|<03><00>tj|<04><00>d <0B>z}d d |iz}ttj |<07><00><00><00><00>dx}x}}|<02>
<00><00>}|d} d}| |u}
|
sltjd|
fd| |f<02><00>tj| <09><00>tj|<05><00>d<12>z} dd| iz} ttj | <0C><00><00><00><00>dx} x}
}|dd} d}| |k}
|
sltjd|
fd| |f<02><00>tj| <09><00>tj|<05><00>d<12>z} dd| iz} ttj | <0C><00><00><00><00>dx} x}
}|<01>dddd<19><02><06><00><00>d{V<00><03>}|j}d}||k}|s<>tjd|fd ||f<02><00>d
t j<00><00>vstj|<02><00>rtj|<02><00>nd
tj|<03><00>tj|<04><00>d <0B>z}d d |iz}ttj |<07><00><00><00><00>dx}x}}|<02>
<00><00>}|d} d}| |u}
|
sltjd|
fd| |f<02><00>tj| <09><00>tj|<05><00>d<12>z} dd| iz} ttj | <0C><00><00><00><00>dx} x}
}d} |d}| |v}
|
sltjd|
fd| |f<02><00>tj| <09><00>tj|<05><00>d<12>z} dd| iz} ttj | <0C><00><00><00><00>dx} x}
}d} |d}| |v}
|
sltjd|
fd| |f<02><00>tj| <09><00>tj|<05><00>d<12>z} dd| iz} ttj | <0C><00><00><00><00>dx} x}
}dS)N<>/auth/register<65>apiuserzapi@example.com<6F> Str0ng!Pass1r<31><00><01>json<6F><6E>r3<00>z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)s<>respr<70>r<>rg<00>successTrdr<>r^r_r`r<>rWr]<00> /auth/login<69>r<>r<><00><><00> access_tokenr?<00>z%(py1)s in %(py4)s<> refresh_token) <0B>postr<74>rr9rrrr r!r"r<>) r#r<>r<>r,r-r$rIrk<00>bodyrFrGr%r/s r&<00>test_register_and_loginz#TestAuthAPI.test_register_and_login<69>s<><00><00><00><00><1C>[<5B>[<5B>!1<>!<21>&<26>&<26>9
<EFBFBD>9
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04>
'<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26><13>y<EFBFBD>y<EFBFBD>{<7B>{<7B><04>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<>4<><1C>[<5B>[<5B><1D>&<26>&<26>6
<EFBFBD>6
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04> '<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26><13>y<EFBFBD>y<EFBFBD>{<7B>{<7B><04>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.r(c<00><00>K<00>|<01>ddddd<05><03><06><00><00>d{V<00><03>|<01>dddd <09><02><06><00><00>d{V<00><03>}|j}d
}||k}|s<>tjd |fd ||f<02><00>d t j<00><00>vstj|<02><00>rtj|<02><00>nd tj|<03><00>tj|<04><00>d<0E>z}dd|iz}ttj |<07><00><00><00><00>dx}x}}dS)Nr<4E><00>wrongpwzwrongpw@example.comr<6D>r<>r<>r<>zWrongPassword1!r<><00><>r3r<>r<>r<>r<>rg<00>
r<EFBFBD>r<>rr9rrrr r!r"<00>r#r<>r<>r,r-r$rIrks r&<00>test_login_wrong_passwordz%TestAuthAPI.test_login_wrong_password<72>s<><00><00><00><00><14>k<EFBFBD>k<EFBFBD>*<2A>!<21>*<2A>&<26>2
<EFBFBD>2
<EFBFBD>k<EFBFBD> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>
<1C>[<5B>[<5B><1D>*<2A>)<29>6
<EFBFBD>6
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04> '<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&r(c<00><00>K<00>|<01>ddddd<05><03><06><00><00>d{V<00><03>|<01>ddddd<05><03><06><00><00>d{V<00><03>}|j}d}||k}|s<>tjd |fd
||f<02><00>d t j<00><00>vstj|<02><00>rtj|<02><00>nd tj|<03><00>tj|<04><00>d <0C>z}d d|iz}ttj |<07><00><00><00><00>dx}x}}dS)Nr<4E><00>dup1zdup@example.comr<6D>r<>r<><00>dup2i<32>r3r<>r<>r<>r<>rgr<>r<>s r&<00>test_register_duplicate_emailz)TestAuthAPI.test_register_duplicate_email<69>s<><00><00><00><00><14>k<EFBFBD>k<EFBFBD>*<2A><1E>&<26>&<26>2
<EFBFBD>2
<EFBFBD>k<EFBFBD> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>
<1C>[<5B>[<5B>!1<><1E>&<26>&<26>9
<EFBFBD>9
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04>
'<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&r(c<00><00><>K<00>|<01>ddddd<05><03><06><00><00>d{V<00><03>}|j}d}||k}|s<>tjd|fd ||f<02><00>d
t j<00><00>vstj|<02><00>rtj|<02><00>nd
tj|<03><00>tj|<04><00>d <0B>z}d d |iz}ttj |<07><00><00><00><00>dx}x}}dS)Nr<4E><00>weakpwdzweakpwd@example.comr<6D>r<>r<>r<>r3r<>r<>r<>r<>rgr<>r<>s r&<00>test_register_weak_passwordz'TestAuthAPI.test_register_weak_password<72>s><00><00><00><00><1B>[<5B>[<5B>!1<>!<21>*<2A>&<26>9
<EFBFBD>9
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04>
'<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&r(c<00><00><>K<00>|<01>ddddd<05><03><06><00><00>d{V<00><03>|<01>dddd<08><02><06><00><00>d{V<00><03>}|<02><00><00>d d
}|<01>d d d |<03><00>i<01><0E><00><00>d{V<00><03>}|j}d}||k}|s<>t jd|fd||f<02><00>dt j<00><00>vst j|<04><00>rt j |<04><00>ndt j |<05><00>t j |<06><00>d<13>z}dd|iz} tt j | <09><00><00><00><00>dx}x}}|<04><00><00>}
|
d d} d}| |k} | slt jd| fd| |f<02><00>t j | <0B><00>t j |<07><00>d<18>z} dd| iz}tt j |<0E><00><00><00><00>dx} x} }|
d d} d}| |k} | slt jd| fd| |f<02><00>t j | <0B><00>t j |<07><00>d<18>z} dd| iz}tt j |<0E><00><00><00><00>dx} x} }dS)Nr<4E><00>meuserzme@example.comr<6D>r<>r<>r<>r<>r<>r<><00>/auth/me<6D> AuthorizationzBearer )<01>headersr<73>r3r<>r<>r<>r<>rgrWr]r^r_r`r<>) r<>r<><00>getr<74>rr9rrrr r!r")r#r<><00>
login_resprar<>r,r-r$rIrkr<>rFrGr%r/s r&<00>test_me_endpointzTestAuthAPI.test_me_endpoint<6E>sb<00><00><00><00><14>k<EFBFBD>k<EFBFBD>*<2A> <20>%<25>&<26>2
<EFBFBD>2
<EFBFBD>k<EFBFBD> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>
"<22>;<3B>;<3B>}<7D>%<25>&<26><
<EFBFBD><
<EFBFBD>;<3B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>
<EFBFBD><1B><0F><0F>!<21>!<21>&<26>)<29>.<2E>9<><05><1B>Z<EFBFBD>Z<EFBFBD> <16>$<24>&7<><05>&7<>&7<>8<> <20>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><04> '<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26><13>y<EFBFBD>y<EFBFBD>{<7B>{<7B><04>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>3<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8r(c<00><00>0K<00>|<01>ddddd<05><03><06><00><00>d{V<00><03>|<01>dddd<08><02><06><00><00>d{V<00><03>}|<02><00><00>d d
}|<01>d d
|i<01><06><00><00>d{V<00><03>}|j}d }||k}|s<>tjd |fd||f<02><00>dt j<00><00>vstj|<04><00>rtj|<04><00>ndtj|<05><00>tj|<06><00>d<10>z}dd|iz} ttj
| <09><00><00><00><00>dx}x}}|<04><00><00>}
|
d} d}| |u} | sltjd| fd| |f<02><00>tj| <0B><00>tj|<07><00>d<17>z} dd| iz}ttj
|<0E><00><00><00><00>dx} x} }d} |
d }| |v} | sltjd| fd| |f<02><00>tj| <0B><00>tj|<07><00>d<17>z} dd| iz}ttj
|<0E><00><00><00><00>dx} x} }|
d d
}||k}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<0F><00>rtj|<0F><00>ndd
t j<00><00>vstj|<03><00>rtj|<03><00>nd
d <20>z}d!d"|iz} ttj
| <0A><00><00><00><00>d}|<01>d d
|i<01><06><00><00>d{V<00><03>}|j}d#}||k}|s<>tjd |fd||f<02><00>d$t j<00><00>vstj|<11><00>rtj|<11><00>nd$tj|<05><00>tj|<06><00>d<10>z}dd|iz} ttj
| <09><00><00><00><00>dx}x}}dS)%Nr<4E><00> refreshuserzrefresh@example.comr<6D>r<>r<>r<>r<>r<>r<>z /auth/refreshr<68>r3r<>r<>r<>r<>rgr<>Trdr<>r^r_r`r<>r?r<>r<>)z%(py0)s != %(py2)s<> new_refreshr7r8rr<><00>resp2) r<>r<>r<>rr9rrrr r!r")r#r<>rr<>r<>r,r-r$rIrkr<>rFrGr%r/rr<rs r&<00>test_refresh_endpointz!TestAuthAPI.test_refresh_endpointso<00><00><00><00><14>k<EFBFBD>k<EFBFBD>*<2A>%<25>*<2A>&<26>2
<EFBFBD>2
<EFBFBD>k<EFBFBD> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>
"<22>;<3B>;<3B>}<7D>*<2A>&<26><
<EFBFBD><
<EFBFBD>;<3B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B>
<EFBFBD>#<23><0F><0F>)<29>)<29>&<26>1<>/<2F>B<> <0A><1C>[<5B>[<5B><1F> <1B>]<5D>8
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04> '<27>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26><13>y<EFBFBD>y<EFBFBD>{<7B>{<7B><04>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D><1A>6<EFBFBD>l<EFBFBD>?<3F>3<> <0B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B><1D>k<EFBFBD>k<EFBFBD>/<2F> <1B>]<5D>9
<EFBFBD>k<EFBFBD> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><05> (<28>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'r(c<00><00><>K<00>|<01>d<01><00><00>d{V<00><03>}|j}d}||v}|s<>tjd|fd||f<02><00>dt j<00><00>vstj|<02><00>rtj|<02><00>ndtj|<03><00>tj|<04><00>d<06>z}dd|iz}ttj |<07><00><00><00><00>dx}x}}dS) Nr<4E>)r<>i<>r?)z3%(py2)s
{%(py2)s = %(py0)s.status_code
} in %(py5)sr<73>r<>r<>rg)
rr<>rr9rrrr r!r"r<>s r&<00>test_me_without_tokenz!TestAuthAPI.test_me_without_token.s<00><00><00><00><1B>Z<EFBFBD>Z<EFBFBD>
<EFBFBD>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B>+<2B><04>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-r(c<00><00><>K<00>|<01>dddd<04><02><05><00><00>d{V<00><03>}|<02><00><00>}|d}d}||u}|sltjd |fd
||f<02><00>tj|<04><00>tj|<05><00>d <0B>z}d d |iz}t tj|<08><00><00><00><00>dx}x}}|d}d}||u}|sltjd |fd
||f<02><00>tj|<04><00>tj|<05><00>d <0B>z}d d |iz}t tj|<08><00><00><00><00>dx}x}}d}||v}|s<>tjd|fd||f<02><00>tj|<04><00>dtj<00><00>vstj |<03><00>rtj|<03><00>ndd<13>z} dd| iz}
t tj|
<EFBFBD><00><00><00><00>dx}}dS)z1Verify error responses follow the unified format.r<>znobody@example.comz
Whatever1!r<>r<>Nr<4E>Frdr<>r^r_r`r<><00>errorr?rAr<>rCrDr+)
r<EFBFBD>r<>rr9r r!r"rrr) r#r<>r<>r<>rFr$rGr%r/rHrIs r&<00>test_unified_error_formatz%TestAuthAPI.test_unified_error_format3s<><00><00><00><00><1C>[<5B>[<5B><1D>)<29>$<24>6
<EFBFBD>6
<EFBFBD>[<5B> <0B> <0B> <0B> <0B> <0B> <0B> <0B> <0B><04><14>y<EFBFBD>y<EFBFBD>{<7B>{<7B><04>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23>#<23><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E><1E>r(N)rKrLrM<00>__doc__r<5F>r<>r<>rNrOr<>r<>r<>r<>r<>rrr
r rQr(r&r<>r<><00>s@<00><00><00><00><00><00>><3E>><3E><13><1B>)<29>)<29><1C><1B>)<29>B <0C>[<5B><18>/<2F>/<2F><19><18>/<2F>. <0C>[<5B><18>
'<27>
'<27><19><18>
'<27> <0C>[<5B><18> '<27> '<27><19><18> '<27> <0C>[<5B><18>'<27>'<27><19><18>'<27> <0C>[<5B><18>9<>9<><19><18>9<>* <0C>[<5B><18>(<28>(<28><19><18>(<28>: <0C>[<5B><18>.<2E>.<2E><19><18>.<2E> <0C>[<5B><18> <1F> <1F><19><18> <1F> <1F> r(r<>)#r<00>builtinsr<00>_pytest.assertion.rewrite<74> assertion<6F>rewriterrNr<><00> unittest.mockrr<00>fastapirr<>rr<>rrr<>r r
r r r <00>&auth_service.app.services.auth_servicer<00>auth_service.app.schemas.userrrrrSror<>r<>rQr(r&<00><module>rs<><00><01><04><04>
<01><00><00><00><00><00><00><00><00><00><00><00><00> <0A> <0A> <0A> <0A><15><15><15><15>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A>!<21>!<21>!<21>!<21>!<21>!<21><1E><1E><1E><1E><1E><1E>6<>6<>6<>6<>6<>6<>6<>6<><02><02><02><02><02><02><02><02><02><02><02><02><02><02>?<3F>><3E>><3E>><3E>><3E>><3E>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F> %<25>%<25>%<25>%<25>%<25>%<25>%<25>%<25>F @<01> @<01> @<01> @<01> @<01> @<01> @<01> @<01>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>@$"<22>$"<22>$"<22>$"<22>$"<22>$"<22>$"<22>$"<22>Td<1F>d<1F>d<1F>d<1F>d<1F>d<1F>d<1F>d<1F>d<1F>dr(