Files
chongming-auth/tests/__pycache__/test_auth_store.cpython-312-pytest-9.1.1.pyc
T

164 lines
27 KiB
Plaintext
Raw Normal View History

2026-09-10 16:30:53 +08:00
Ë
¾1¢jÖãó>—dZddlZddlmcmZddlZddlZddl m
Z
ddl Z ddl m
Z
ddlmZmZmZmZmZmZmZmZe j.«d„«Ze j.«d„«Ze j4j6d„«Ze j4j6d „«Ze j4j6d
„«Ze j4j6d „«Ze j4j6d „«Z e j4j6d
„«Z!d„Z"d„Z#de
fd„Z$y)uechongming-auth 共享包测试:schema 兼容ã€�seed 幂等/å¹¶å�‘ã€�登录校验ã€�claims 契约。éN)ÚPath)ÚJWT)ÚLoginPostRequestÚLoginPostResponseÚUsersÚ issue_tokenÚ
open_databaseÚ
seed_adminÚtouch_last_loginÚ verify_logincó—y)NÚasyncio©róú@/home/chakcy/chongming-zenoh/utils/auth/tests/test_auth_store.pyÚ
anyio_backendrs€à rcóŠK—tdt|«i«ƒd{–—†}|­–—|j«ƒd{–—†y7Œ"7Œ­w)NÚdata_dir)r ÚstrÚdispose)Útmp_pathÚdatabases rÚdbrs=èø€ä" J´°H³
Ð#>Ó?×?€HØ
ƒNØ
×
Ñ
Ó
×Ñð@øàús‚Aœ?�A¹AºAÁAcƒóâK—tdt|«i«ƒd{–—†}|j«4ƒd{–—†}ddlm}|j |t ««ƒd{–—†j«j«}ddd«ƒd{–—†g}|k(}|s™tjd|fd||f«dtj«vstj|«rtj|«ndtj|«dœz}d d
|iz}ttj |««‚dx}}|j#«ƒd{–—†y7�Œ27�Œ7Œõ7ŒË#1ƒd{–—†7swYŒÛxYw7Œ$­w) uC建库å�³å»º users 表(SQLModel 元数æ�®éš�包导入注册)。rNr©Úselect©ú==)z%(py0)s == %(py3)sÚrows©Úpy0Úpy3úassert %(py5)sÚpy5)r rÚ get_sessionÚ
sqlalchemyrÚexecuterÚscalarsÚallÚ
@pytest_arÚ_call_reprcompareÚ @py_builtinsÚlocalsÚ_should_repr_global_nameÚ _safereprÚAssertionErrorÚ_format_explanationr) rrÚsessionrrÚ @py_assert2Ú @py_assert1Ú @py_format4Ú @py_format6s rÚ&test_open_database_creates_users_tabler7!s
èø€ô# J´°H³
Ð#>Ó?×?€HØ×#Ñ#Ó%÷FðF¨Ý%à—o‘o¡f¬U£mÓ4×4×=Ñ=Ó?×CÑCÓEˆ÷F÷FðЈ4�2‰:××Õˆ4�2×××××ш4××Óˆ4××Ô�2××××××ÑØ
×
Ñ
Ó
×Ñð
@ùðFùð5øðFø÷F÷FñFúð
úss‚E/œE�E/µEE/¹%EÁEÁ EÁ? E/Â
E B=E/ÅE-Å E/ÅE/ÅEÅE/ÅE*ÅE! ÅE*Å&E/cƒónK—t|«ƒd{–—†}d}||u}|sltjd|fd||f«tj|«tj|«dœz}dd|iz}t tj
|««‚dx}x}}t|«ƒd{–—†}d}||u}|sltjd|fd||f«tj|«tj|«dœz}dd|iz}t tj
|««‚dx}x}}t|d¬ «ƒd{–—†}d}||u}|sltjd|fd||f«tj|«tj|«dœz}dd|iz}t tj
|««‚dx}x}}y7�Œœ7�Œ7Œ…­w)
NT©Úis©z%(py1)s is %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6FÚother)Úpassword)r
r*r+r/r0r1)rÚ @py_assert0Ú @py_assert3r3Ú @py_format5Ú @py_format7s rÚtest_seed_admin_idempotentrG-sèø€ä˜B“× Ð' 4Ð'Ð  4Ð '×'×'Õ'Ð  4×'×'Ó'Ð ×'×'Ò' 4×'×'×'×'×'×'Ó'ä˜B“× Ð( 5Ð(Ð  5Ð (×(×(Õ(Ð  5×(×(Ó(Ð ×(×(Ò( 5×(×(×(×(×(×(Ó(ܘB¨Ô1× 1Ð:°UÐ:Ð 1°UÐ :×:×:Õ:Ð 1°U×:×:Ó:Ð 1×:×:Ò:°U×:×:×:×:×:×:Ô:ð ùà ùØ 1ús6‚F5‘F-’B F5ÂF0ÂBF5Ä-F3Ä.BF5Æ0F5Æ3F5cƒó¸K—tdt|«i«ƒd{–—†}tjt d«D�cgc]
}t |«‘Œc}ddiŽƒd{–—†}|D�cgc]}t
|t«sŒ|‘Œ}}| }|s~tjd|›�«dzdd tj«vstj|«rtj|«nd iz}ttj|««‚d}d
„|D«}t!|«}d } || k(}
|
sÉtj"d |
fd
|| f«dtj«vstjt «rtjt «ndtj|«tj|«tj| «dœz} dd| iz} ttj| ««‚dx}x}x}
} ddlm}
|j)«4ƒd{–—†}|j+|
t,««ƒd{–—†j/«j1«}ddd«ƒd{–—†t3«}d }
||
k(}|sötj"d |fd||
f«dtj«vstjt2«rtjt2«nddtj«vstj|«rtj|«ndtj|«tj|
«dœz}dd|iz}ttj|««‚dx}x}}
|d}|j4}d}
||
u}|s€tj"d|fd||
f«tj|«tj|«tj|
«dœz}dd|iz}ttj|««‚dx}x}x}}
|j7«ƒd{–—†y7�Œ
cc}w7�ŒØcc}w7�Œ.7�Œ7�Œå#1ƒd{–—†7swY�ŒöxYw7Œ4­w)u]gunicorn 多进程并å�‘å�¯åŠ¨åœºæ™¯ï¼šå¹¶å�‘ç§�å­�ä¸�抛 IntegrityError,仅一æ�¡ admin。rNéÚreturn_exceptionsTu#å¹¶å�‘ç§�å­�存在未æ�•获异常: z
>assert not %(py0)sr!Úerrorsc3ó*K—|] }|dusŒd–—Œ
y­w)TéNr)Ú.0Úrs rú <genexpr>z-test_seed_admin_concurrent.<locals>.<genexpr>>sèø€Ò/�Q Q¨$¢YŒqÑ/ùs‚ ŒrMr)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚsum)r!Úpy2r>Úpy7zassert %(py9)sÚpy9rr)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenr)r!r=r"r@zassert %(py8)sÚpy8r9)z4%(py3)s
{%(py3)s = %(py1)s.is_superuser
} is %(py6)s)r=r"r@)r rrÚgatherÚranger
Ú
isinstanceÚ Exceptionr*Ú_format_assertmsgr,r-r.r/r0r1rQr+r&rr%r'rr(r)rUÚ is_superuserr)rrÚ_ÚresultsrOrKr4Ú @py_format2rDÚ @py_assert6Ú @py_assert5Ú @py_format8Ú @py_format10rr2rr3Ú @py_assert4rFÚ @py_format9rCs rÚtest_seed_admin_concurrentrf5sÒèø€ô# J´°H³
Ð#>Ó?×?€HÜ—N‘NÜ(-¨a«Ö 1 1Œ*�XÕ
Ò 1ðØEIñ÷€Gð!Ö
=�A¤J¨q´)Õ$<ŠaÐ
=€FÐ
=؈:ÐE‰:×EÖEÐ<¸V¸HÐE×E×E×E×E×EÔEˆv×E×EÓEˆv×E×E×E×E×EÑEÙ/˜'Ô/Ð4Œ3Ð/Ó /Ð4°1Ð4Ð /°1Ñ 4×4×4Õ4Ð /°1×4×4×4×4×4Ñ4Œ3×4×4Ó4Œ3×4×4Ô4Ð/×4×4Ò4Ð /×4×4Ò4°1×4×4×4×4×4×4Õ4å!à×#Ñ#Ó%÷FðF¨Ø—o‘o¡f¬U£mÓ4×4×=Ñ=Ó?×CÑCÓEˆ÷F÷Fä ˆt‹9ИЈ9˜‰>××Õˆ9˜×××××ÑŒ3××ÓŒ3×××××Òˆt××Óˆt××Ôˆ9××Ò˜××××××ÓØ �‰7Ð'ˆ7× Ñ Ð' 4Ð'Ð  4Ð '×'×'Õ'Ð  4×'×'Ó'ˆ7×'×'Ò'Ð ×'×'Ò' 4×'×'×'×'×'×'Õ'Ø
×
Ñ
Ó
×Ñð@ûâ 1ðûò>ð FùØ4ùðFù÷F÷FòFúðús¦‚QœP)� Q½P,Á
QÁP1ÁQÁ"P4Á8P4Á<FQÈ P9È QÈQÈ.P<È/ QÉ QÉP?ÉGQÐ#QÐ$QÐ,QÐ4QÐ<QÐ?QÑQÑQ Ñ QÑ QcƒóK—t|«ƒd{–—†t|dd«ƒd{–—†\}}g}d}||u}|}|r d}||k(}|}|�sXtjd|fd||f«dt j
«vstj |«rtj|«ndtj|«dœz} dd | iz}
|j|
«|rŒtjd
fd |f«d t j
«vstj |«rtj|«nd tj|«d
œz} dd| iz} |j| «tj|d«iz}
dd|
iz}ttj|««‚dx}x}x}x}x}}t|dd«ƒd{–—†\}}g}d}||u}|}|r d}||k(}|}|�sXtjd|fd||f«dt j
«vstj |«rtj|«ndtj|«dœz} dd | iz}
|j|
«|rŒtjd
|fd ||f«d t j
«vstj |«rtj|«nd tj|«d
œz} dd| iz} |j| «tj|d«iz}
dd|
iz}ttj|««‚dx}x}x}x}x}}t|dd«ƒd{–—†\}}g}d}||u}|}|r d}||k(}|}|�sXtjd|fd||f«dt j
«vstj |«rtj|«ndtj|«dœz} dd | iz}
|j|
«|rŒtjd
|fd ||f«d t j
«vstj |«rtj|«nd tj|«d
œz} dd| iz} |j| «tj|d«iz}
dd|
iz}ttj|««‚dx}x}x}x}x}}ddl m
}|j«4ƒd{–—†}tdd|d«d¬«}|j!|«|j#«ƒd{–—†ddd«ƒd{–—†t|dd«ƒd{–—†\}}g}d}||u}|}|r d }||k(}|}|�sXtjd|fd||f«dt j
«vstj |«rtj|«ndtj|«dœz} dd | iz}
|j|
«|rŒtjd
|fd ||f«d t j
«vstj |«rtj|«nd tj|«d
œz} dd| iz} |j| «tj|d«iz}
dd|
iz}ttj|««‚dx}x}x}x}x}}y7�ŒÃ7�Œ±7�Œ 7�Œ�7�Œô7�Œ¹7�Œ¬#1ƒd{–—†7swY�Œ½xYw7�Œ°­w)!uM失败文案与拆分å‰� plugins.auth.login é€�字一致(å‰�端兼容)。NÚadminÚ©úis not©z%(py2)s is not %(py5)sÚuser©rRr$ú%(py7)srSr©z%(py9)s == %(py12)sÚmsg©rTÚpy12ú%(py14)sÚpy14rúassert %(py17)sÚpy17ÚnouserÚxõ用户å��错误r9)z%(py2)s is %(py5)sÚwrongu 密ç �错误)Ú
hash_passwordÚzhangzzhang@example.comÚpwdF)ÚusernameÚemailÚhashed_passwordÚ is_activeu用户已ç»�注销或被ç¦�用)r
r r*r+r,r-r.r/ÚappendÚ_format_boolopr0r1Úchongming_passwordr|r%rÚaddÚcommit)rrmrqr4rdrDrCÚ @py_assert11Ú @py_assert10r6rbÚ @py_format13Ú @py_format15Ú @py_format16Ú @py_format18r|r2Údisableds rÚtest_verify_login_messagesr�Isèø€ô �R‹.×Ðä" 2 w°Ó8×8�I€Dˆ#Ù)�tÐ)ˆ4�tÐ Ô) rÐ)  r¡ ×)×)×)Ð)ˆ4�t×)×)×)×)×)Ñ)ˆ4×)×)Ó)ˆ4×)×)Ô)�t×)×)×)×)×)×)Õ)  r×)×)×)×)×)Ñ) ×)×)Ó) ×)×)Ô) r×)×)×)×)×)×)×)×)×)×)×)×)×)Ò)ä" 2 x°Ó5×5�I€Dˆ#Ù4�4Ð4ˆ4�4ˆ<Ô4Ð#4Ð4˜CÐ#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˜CÐ#4×4×4×4×4×4Ñ4˜C×4×4Ó4˜C×4×4Ô4Ð#4×4×4×4×4×4×4×4×4×4×4×4×4×4Ò4ä" 2 w°Ó8×8�I€Dˆ#Ù1�4Ð1ˆ4�4ˆ<Ô1 >Ð1˜C >Ñ1×1×1×1Ð1ˆ4�4×1×1×1×1×1Ñ1ˆ4×1×1Ó1ˆ4×1×1Ô1�4×1×1×1×1×1×1Õ1˜C >×1×1×1×1×1Ñ1˜C×1×1Ó1˜C×1×1Ô1 >×1×1×1×1×1×1×1×1×1×1×1×1×1Ò1õ1à�~‰~Ó÷ð 7ÜØØ%Ù)¨%Ó0Øô 
ˆð � ‰ �HÔØ�n‰nÓ×Ð÷÷ô# 2 w°Ó6×6�I€Dˆ#ÙC�4ÐCˆ4�4ˆ<ÔCÐ#CÐC˜CÐ#CÑC×C×C×CÐCˆ4�4×C×C×C×C×CÑCˆ4×C×CÓCˆ4×C×CÔC�4×C×C×C×C×C×CÕC˜CÐ#C×C×C×C×C×CÑC˜C×C×CÓC˜C×C×CÔCÐ#C×C×C×C×C×C×C×C×C×C×C×C×C×CÓCð1ùà8ùð6ùð9ùð ùð ùðù÷÷òúð7ûs­‚\‘[’\¦[§F\Æ:[Æ;F\Í[ÍF\Ó,[ Ó-\Ó0:[)Ô*[#Ô+[)Ô/ \Ô:[&Ô;\Õ[?ÕF\Û\Û\Û\Û \Û#[)Û&\Û)[<Û/[2 Û0[<Û7 \c ƒóØ K—t|«ƒd{–—†t|dd«ƒd{–—†\}}d\}}t|||d¬«}td«j t ||«j
|««}hd£}|j}|«} t| «}
||
k} | �stjd| fd ||
f«tj|«d
tj«vstjt«rtjt«nd
d tj«vstj|«rtj|«nd tj|«tj| «tj|
«d œz} d
d| iz}
ttj |
««‚dx}x} x}x} }
ddh}|j}|«} t| «}
||
k} | �stjd| fd ||
f«tj|«d
tj«vstjt«rtjt«nd
d tj«vstj|«rtj|«nd tj|«tj| «tj|
«d œz} d
d| iz}
ttj |
««‚dx}x} x}x} }
|d}|j"}||k(} | s­tjd| fd||f«tj|«dtj«vstj|«rtj|«ndtj|«dœz}dd|iz}ttj |««‚dx}x} }|d}d}||k(} | sltjd| fd||f«tj|«tj|«dœz}dd|iz}ttj |««‚dx}x} }|d}d}||u} | sltjd| fd ||f«tj|«tj|«dœz}dd|iz}ttj |««‚dx}x} }y7�ŒÓ7�ŒÁ­w)!uYclaims 与拆分å‰� plugins.auth.login 完全一致,且å�¯è¢«ç½‘å…³ JWT 解密回读。Nrh)z test-secretÚHS256é<)Úexpires_in_secondsÚorjson> Úsubr€ÚphonerÚ full_nameÚ
avatar_urlÚ
created_atÚ
updated_atÚ is_verifiedr\Ú
last_login_at)ú<=)zc%(py1)s <= %(py10)s
{%(py10)s = %(py3)s(%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.keys
}()
})
}ÚsetÚpayload)r=r"r>r@rVÚpy10zassert %(py12)srsÚiatÚexpr•r)z*%(py1)s == %(py5)s
{%(py5)s = %(py3)s.id
}rm)r=r"r$úassert %(py7)srSr)z%(py1)s == %(py4)sr<r?r@r\Tr9r;)r
r rÚ
__import__ÚloadsrÚdecodeÚkeysržr*r+r/r,r-r.r0r1Úid)rrmr]ÚsecretÚ algorithmÚtokenrŸrCraÚ @py_assert7Ú @py_assert9r3Ú @py_format11rŠrdr6rbrDrErFs rÚ test_issue_token_claims_contractr¯gsqèø€ô �R‹.×ÐÜ   W¨gÓ6×6�G€Dˆ!à.Ñ€FˆIÜ ˜˜f iÀBÔ G€Eä˜Ó"×(Ñ(¬¨V°YÓ)?×)FÑ)FÀuÓ)MÓN€Gò ð4à$+§L¡Lð4á$0£Nð4ä # NÓ 3ð4ð à 3ñ 4÷4ð4ç"3Ñ"3ó4ð à 3÷4ñ4ç*3©)ð ÷4ñ4ç-3©V÷4ò4ç3Ñ3¤÷4ñ4ç*3©)¤÷4ó4ç-3©V÷4ò4ç3Ñ3 G÷4ñ4ç*3©) G÷4ò4ç*3©) L÷4ð4ç*3©) N÷4ð4ç*3©)Ð 3÷4÷4÷4ñ4ç 3Ñ 3÷4÷4ó4ð
�5ˆ>Ð0 §¡Ð0¡£Ð0œS Ó0Ð0ˆ>Ð0Ñ 0×0×0Ö0ˆ>Ð0×0×0Ó0ˆ>×0×0×0×0×0Ð0œS×0×0Ó0œS×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Ø �5‰>Ð$˜TŸW™WÐ$ˆ>˜WÑ $×$×$Õ$ˆ>˜W×$×$Ó$ˆ>×$×$×$×$×$Ð$˜T×$×$Ó$˜T×$×$Ô$˜W×$×$×$×$×$×$Ó$Ø �:Ñ Ð) 'Ð)Ð  'Ñ )×)×)Õ)Ð  '×)×)Ó)Ð ×)×)Ò) '×)×)×)×)×)×)Ó)Ø �>Ñ "Ð* dÐ*Ð " dÐ *×*×*Õ*Ð " d×*×*Ó*Ð "×*×*Ò* d×*×*×*×*×*×*Ô*ðùØ6ûs ‚S*‘S$’S*¦S'§R>S*Ó'S*cƒóÐK—t|«ƒd{–—†t|dd«ƒd{–—†\}}|j}d}||u}|s­tjd|fd||f«dt j «vstj|«rtj|«ndtj|«tj|«dœz}dd|iz}ttj|««‚dx}x}}t||«ƒd{–—†dd l m
}|j«4ƒd{–—†} | j|t «j#d¬
««ƒd{–—†j%«}
ddd«ƒd{–—†
j}d}||u}|s­tjd |fd ||f«d
t j «vstj|
«rtj|
«nd
tj|«tj|«dœz}dd|iz}ttj|««‚dx}x}}y7�Œ07�Œ7�ŒC7�Œ'7Œö7ŒÚ#1ƒd{–—†7swYŒêxYw­w)Nrhr9)z5%(py2)s
{%(py2)s = %(py0)s.last_login_at
} is %(py5)srm©r!rRr$r£rSrr)rrj)z9%(py2)s
{%(py2)s = %(py0)s.last_login_at
} is not %(py5)sÚrow)r
r rœr*r+r,r-r.r/r0r1r r&rr%r'rÚ filter_byÚ
scalar_one) rrmr]r4rdrDr6rbrr2r²s rÚtest_touch_last_login_persistsrµ{s£èø€ä
�R‹.×ÐÜ   W¨gÓ6×6�G€Dˆ!Ø × Ñ Ð% Ð%Ð  Ð %×%×%Õ%Ð  ×%×%×%×%×%Ñ%ˆ4×%×%Ó%ˆ4×%×%Ô%Ð ×%×%Ò% ×%×%×%×%×%×%Ó%ä
˜2˜tÓ