From d6781b2051fecfeb884dd84220c2c40a60912ef5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 10:44:37 +0000 Subject: [PATCH] Implement comprehensive testing suite and robustness improvements - Add environment validation script (scripts/check_env.py) - Create unit tests for CLI output parsing (tests/test_cli_parsing.py) - Implement config validation and fallback logic tests (tests/test_config_fallback.py) - Add E2E live integration tests (tests/test_e2e_live.py) - Add stress and error recovery tests (tests/test_robustness.py) - Fix parsing and logging bugs in src/claude_cli_auth/cli_interface.py and auth_manager.py - Update README.md with detailed testing instructions --- .coverage | Bin 0 -> 53248 bytes README.md | 34 ++++ dist/claude_cli_auth-1.0.0-py3-none-any.whl | Bin 0 -> 39200 bytes dist/claude_cli_auth-1.0.0.tar.gz | Bin 0 -> 35937 bytes scripts/check_env.py | 107 ++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2893 bytes .../__pycache__/auth_manager.cpython-312.pyc | Bin 0 -> 24378 bytes .../__pycache__/cli_interface.cpython-312.pyc | Bin 0 -> 34179 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13861 bytes .../__pycache__/facade.cpython-312.pyc | Bin 0 -> 23406 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 15928 bytes .../__pycache__/sdk_interface.cpython-312.pyc | Bin 0 -> 26039 bytes src/claude_cli_auth/auth_manager.py | 5 +- src/claude_cli_auth/cli_interface.py | 48 ++--- .../test_basic.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 22365 bytes ...t_cli_parsing.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 23165 bytes ...nfig_fallback.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 18246 bytes ...test_e2e_live.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 14152 bytes ...st_robustness.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 5648 bytes tests/test_basic.py | 51 +++-- tests/test_cli_parsing.py | 176 ++++++++++++++++ tests/test_config_fallback.py | 190 ++++++++++++++++++ tests/test_e2e_live.py | 140 +++++++++++++ tests/test_robustness.py | 100 +++++++++ 24 files changed, 806 insertions(+), 45 deletions(-) create mode 100644 .coverage create mode 100644 dist/claude_cli_auth-1.0.0-py3-none-any.whl create mode 100644 dist/claude_cli_auth-1.0.0.tar.gz create mode 100644 scripts/check_env.py create mode 100644 src/claude_cli_auth/__pycache__/__init__.cpython-312.pyc create mode 100644 src/claude_cli_auth/__pycache__/auth_manager.cpython-312.pyc create mode 100644 src/claude_cli_auth/__pycache__/cli_interface.cpython-312.pyc create mode 100644 src/claude_cli_auth/__pycache__/exceptions.cpython-312.pyc create mode 100644 src/claude_cli_auth/__pycache__/facade.cpython-312.pyc create mode 100644 src/claude_cli_auth/__pycache__/models.cpython-312.pyc create mode 100644 src/claude_cli_auth/__pycache__/sdk_interface.cpython-312.pyc create mode 100644 tests/__pycache__/test_basic.cpython-312-pytest-7.4.4.pyc create mode 100644 tests/__pycache__/test_cli_parsing.cpython-312-pytest-7.4.4.pyc create mode 100644 tests/__pycache__/test_config_fallback.cpython-312-pytest-7.4.4.pyc create mode 100644 tests/__pycache__/test_e2e_live.cpython-312-pytest-7.4.4.pyc create mode 100644 tests/__pycache__/test_robustness.cpython-312-pytest-7.4.4.pyc create mode 100644 tests/test_cli_parsing.py create mode 100644 tests/test_config_fallback.py create mode 100644 tests/test_e2e_live.py create mode 100644 tests/test_robustness.py diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..4bcc19f691e1b9d9dbfa0146fd9ee5b284f895cd GIT binary patch literal 53248 zcmeI4e~cSP6~||HZLfX5=1>}$( zz3i@&OC^XeMT!6++J6v2RRez^K?S8k6@RoMQc({i1mq8(NI-!S_frS%aYIMVdw$&x)%(P-&@?fpln|mo??HN} zn@Iy5nAl1u=c>OM~)0F_8PJke?mgFQ*0`9lWXk+(5nX<^IP^yHKGE*gyaT zKmY{Z-UL<-44B1{5$)9HL%UpaLf@`9ew+?|^pksbAKar3?*7OB$bJ9H#2nbft8PN(n{N+#k-;dwHy;iXtR1-WV} z9NFAx*2{$abItk^Hx8AED-OM0C3}?(y~No!+%{Ke%Z|TY&6y(S7L7|a8}8Ajv)1?} z)hStu+-P_u#ZFKJ+}NKherSs(C@P)h;Ao9LZ&`LT^rCZ%8sD0wWZ;YM$eYEnG41rx zC{P%WRd&N*?V!*VG;7&CLWi&SjvMYJ-9f^=s8&RgE?_mTXYvnpf_QwJ2f&hdKz21*zD4vr*x$60i>y@0jD;3(jXDtM**|o#Im64oT939n86{0XoS}WO^T_KdVi)jf;Vpd zk{vFp%WdauGJHInE8e!Xm*H%JHOp!4q0i`%$)`sm`gI!g`E7KW%sCyC_cjr8_%1f)lJ`;n;X&Q#!fuFn^Fb zUE06spkB8d)nvZnX*kwOV?TFJt|uNusGu6BP8m=a-Jmm7nq1`(E7d=}L`+y~-LA&n zof~DH#^a05W$NPD=q@{SLbvWH7Kx0B0_(UPsEY5In*e=tbcTc>CH$SYl* z7xKJ(^{we3tOfxP009sH0T2KI5C8!X009sH0T4(D3>e$B^jiSE&loKvUjp#`|NPJo zh5ViTt~@CZ$(yAy^c%{+1_B@e0w4eaAOHd&00JNY0w4eaSChbd@`l(qV=pbu1b$_v zQnQ;?$Ews^ex%AGoxAi9fRbqltEWs*eZb=Xzx(s_cp;L$F=vPaJ*7#A9wxv_vzsYp z3%ZnMHd9*ns!lB+r4xoB4)?6vS*|!s(NjuDbW%6O{XIq5dyAf}KuTPRf?d$iqXwy_!vox*gyaTKmY_l00ck)1V8`;KmY_l00gc>0){bI;QRmP&<#TVLw-{(%G-ukhiY_+ z4Fo^{1V8`;KmY_l00ck)1VG?zK;S+zs})vCrrw@5#4p=_XzLtzAz~&OQ4rGNt{BCC+P$yZkJxu4eW2%l^Ml zYAuaa=Z@T>J^H`6p0$)N4BwudMb@?6C4T(Ll4-6_@slzrV%`@{^g2RydS7b>_dn56F_QW*&a^_EGWv=bre}$j=@WEju#laZ@~ThY;_4 z_CX>3seN2$m$vD8`|D)1UOoGx$m~{>QZhFdAI%AI!H5n+N(s|8+Fgh;C}C&Bc6w_! zXqiHxMAr$8@#kHnQ|$bj#`phCc}~cS@`8Lx{!P9>PXai{LfAk61V8`;KmY_l00ck) z1V8`;KmY`;SpqrwoESLzGl6FVITkkAOHd& z00JNY0w4eaAOHd&00M6U0lxo__5Ygy5-LCd1V8`;KmY_l00ck)1V8`;K;RlCz<=t< z%jfy`|F6kcEZr{$w`ir QEGHRG3{G@T`1$|;2fvh+9{>OV literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 69cfa7d..f18c043 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,40 @@ response = await claude.query( print(response.content) ``` +## 🧪 Running Tests + +This project includes a comprehensive test suite covering unit, integration, and end-to-end scenarios. + +### Prerequisites + +1. **Install Dependencies:** + ```bash + poetry install + ``` + +2. **Verify Environment:** + Run the environment check script to ensure Node.js, Claude CLI, and authentication are properly set up: + ```bash + python scripts/check_env.py + ``` + +### Running Tests + +**Unit Tests (Offline):** +These tests mock the Claude CLI and do not require authentication or internet access. +```bash +poetry run pytest tests/test_basic.py tests/test_cli_parsing.py tests/test_config_fallback.py tests/test_robustness.py +``` + +**E2E Live Tests (Online):** +These tests interact with the real Claude API via CLI. They require authentication (`claude auth login`) and will consume tokens/cost. +To enable them, set the `RUN_LIVE_TESTS` environment variable: +```bash +export RUN_LIVE_TESTS=1 +poetry run pytest tests/test_e2e_live.py +``` +*Note: If you are not authenticated, these tests will be skipped automatically.* + ## 📚 Complete Documentation ### Configuration diff --git a/dist/claude_cli_auth-1.0.0-py3-none-any.whl b/dist/claude_cli_auth-1.0.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..5764cf279b4bd5a28625584150fa1d0beff22bb8 GIT binary patch literal 39200 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%0AQH$5PHo5uJBm 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 Z=k{~^x&7RJZa?qx^M4T+QrrNj0sw0rT7Uom literal 0 HcmV?d00001 diff --git a/scripts/check_env.py b/scripts/check_env.py new file mode 100644 index 0000000..9111a4a --- /dev/null +++ b/scripts/check_env.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +""" +Environment Validation Script for Claude CLI Auth Project. + +This script checks: +1. Node.js installation +2. Claude CLI (@anthropic-ai/claude-code) presence in PATH +3. Authentication state (claude auth whoami) + +Usage: + python scripts/check_env.py +""" + +import sys +import shutil +import subprocess +import os + +def print_status(message, status="INFO"): + colors = { + "INFO": "\033[94m", # Blue + "SUCCESS": "\033[92m", # Green + "WARNING": "\033[93m", # Yellow + "ERROR": "\033[91m", # Red + "RESET": "\033[0m" + } + prefix = f"[{status}]" + print(f"{colors.get(status, '')}{prefix} {message}{colors['RESET']}") + +def check_command(command, name): + path = shutil.which(command) + if path: + print_status(f"Found {name} at: {path}", "SUCCESS") + return path + else: + print_status(f"{name} ({command}) not found in PATH.", "ERROR") + return None + +def check_claude_auth(): + print_status("Checking Claude authentication status...", "INFO") + try: + # Run 'claude auth whoami' + # We need to capture output to check for "not authenticated" messages + # varying by version, but exit code 0 usually means success or at least CLI ran. + result = subprocess.run( + ["claude", "auth", "whoami"], + capture_output=True, + text=True, + timeout=10 + ) + + output = result.stdout.strip() + stderr = result.stderr.strip() + + print_status(f"Output: {output}") + if stderr: + print_status(f"Stderr: {stderr}", "WARNING") + + if result.returncode == 0: + # Heuristic check for success message + # Adjust these strings based on actual CLI output if needed + if "not authenticated" in output.lower() or "login" in output.lower(): + print_status("Claude CLI is NOT authenticated. Please run 'claude auth login'.", "ERROR") + return False + + print_status("Claude CLI appears authenticated.", "SUCCESS") + return True + else: + print_status(f"Claude auth check failed with exit code {result.returncode}.", "ERROR") + return False + + except subprocess.TimeoutExpired: + print_status("Claude auth check timed out.", "ERROR") + return False + except Exception as e: + print_status(f"An unexpected error occurred: {e}", "ERROR") + return False + +def main(): + print_status("Starting Environment Sanity Check...", "INFO") + + # 1. Check Node.js (prerequisite for Claude CLI) + if not check_command("node", "Node.js"): + print_status("Node.js is required to run Claude CLI.", "ERROR") + sys.exit(1) + + if not check_command("npm", "NPM"): + print_status("NPM is required to install/update Claude CLI.", "WARNING") + + # 2. Check Claude CLI + claude_path = check_command("claude", "Claude CLI") + if not claude_path: + print_status("Claude CLI package (@anthropic-ai/claude-code) is missing.", "ERROR") + print_status("Install it using: npm install -g @anthropic-ai/claude-code", "INFO") + sys.exit(1) + + # 3. Check Authentication + if not check_claude_auth(): + print_status("Authentication check failed. Tests requiring live API will fail.", "ERROR") + # We exit with error to ensure CI/pipeline stops here if this is a prerequisite + sys.exit(1) + + print_status("Environment validation passed! 🚀", "SUCCESS") + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/src/claude_cli_auth/__pycache__/__init__.cpython-312.pyc b/src/claude_cli_auth/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45e116f98ab68f8a00643de38fa18e1f65bfec64 GIT binary patch literal 2893 zcmbVOO>Epm6!vbsKk@D+O`6{p+F{$$UD|AlS^+8zB2ChCX_`h&LM032Ozg>K5|6zd zdy{SsC|nRiNFXl235ipyB5{QioVai*1tl^n!im{_;iElkx_me3P& zui8nL(o-z0r&+7s$~0YL89l?YdY0w%9Bb3tSi9cN_UZeie8TQvoqDHSC++>LOYdUc zdN=FQdswgDEBPtAkM-;Quukg-tXBP?rRmRD8U5LcVr9RK>4&VG)n*^o56d^wQCuO1 zm(Dkm*m;xuZOB7BOBcd-Gxg3%y^GDfa1DI4^u}Jk)!wkjv*2-JuY{8U{^VZ1wePEr z+wqVOd3BB|Zx1MnUU*{Ug@&i4>Alwe-A6+srhGW4D)qMF{@OdLqKw$MW)UqB%P4mX++`@l$1rVbNQ@|}y4;UY5$$nVM#y(G zs@Pw&={$-gr(i2TN)o|6wAVnPCP#n~yw6EQo2rhN?ffVCAUrEK~CmDdQ=%ZJ)G&eKB8k*BOFy(k=mT0?nOABeVj z=_U+cE{~uQNQpW%I3G_N&9G&m-AyKrp1+8F^xp&9DU85a1Y|@p56$ozX^LCGeoqYG zVl2osHCHhnWMMLtp+bBCnsM=R*rVMP5I^4mf_XovfbXzw}; zv=Xv9L)IkmMH}tnO<_2kP9)bA%3XzOO~7IEcS%l%9kYu!Lm7d=7xMZ;?HSj#-^4bx zWTVJWka`qVGXQF!i7iwV0u7=x8VCfL$Y0r6aD(i$JoB?vFiOB$7N*ZOa%+hfOQ%Yw z*0Q5`g<8<8oGh7ZJz`8OnI%gwU#~DsZ8#4sXt`XTDfaSxP!ZlD2;2?|?-ry(kWN9w zF96>!NS7cT2_!F=vJV+acfC?ni@`8fO1etkpT|~{7 z1X<#&1ZsKm!j&L(ZTRYBd2&3+2z!J}*{@;DzIu@Y0Hdt%&McZ#%bG(eat@N z7<0@x$DA`oV?{HrF&Cbhc=L4ejC;&I;~DeJl#G?IG|RMirgW@yrfjTirhKei$LYC< zek!PRF!vj&cv~mkjaBNogB)-D0ms|k*2`&C^ZI~2RD>*jbBW1FED;Td64BY1KNREr z@kl&Q@tII8bSg4~r~Zjq!QVd}n&Tt>{=>sTyZ!iNH1407<>#g&{z(*?j>I(?{Gt3> zUx*0N3Au^(0`<4s!$O3oZiJ@&@x-ivcH3EB!n3i7=&3nD>fH;W=_t>lLH}^VABn~1 z1T>tO3?($J+tIbt!tCjYFg>sBNrY!rO2dk)-I$I}M8fmo=}6H2Ynq;sfKD_%7D`M8 zOroJLHZK|nqTz&SJRFTDMC;MhG*6*v(R3n)$ggRZ0|v2JnjM%*Dgfo0GyK`R48oG=Gtca9DsGEj}!~ zI^Ga5Mog8+GNI>=DO=Ud~}bs?)|ve|$Y}Md>2sa7j5R z7jHvaF^ky|v$L23F-=V@%@lD@*m)<~^zinG9c>vSZhA6d~d6vzw)N_@5v`oR7v% zX~;!OB1HC7+gw~Oz&b+t6{Zly(iCQL%tECexoxx|6DbO@PJ*1Nf;>u=Ywyody_Q92 z$dtH`oLMFZKPWX6n>)=iMb4g%O1yz(V!`0q(9G%Sh%{uHlka`+d#C3Ule01Qm{N#6 z`S?Rn#kw&p#$H+1re{w@V~vHoBt-DCmDizmMtME^r2c@NBG6HE*^V`%% zT(9b)9D1U*^nji?rQF((w%Sl!YMbF+>Z+tEiPgb4)o#zig zt~Q_-ol;lEC!&#QUUbCgPMwOx31-BTwGvwx4^KxKhfydm9-NBL#*&+enaF|z{a4-$ z@9&ViG0sN?bkn1vuJQ2fTrAP;9|<@Gf)N5OEYT_>tB8Pg$%)3P*=S6(sf~#qr5kJx zsZy~>d5UgNM?}~7^lXS%(&C~SJnU3N5RD`-M8k9>2CQR@N2VvF7R}K(O-!6<2`})= zw$9M$)17f4+^IArkGPZg&iITZ9D}FlMeF!DjdXlGS*jU*P)Y4Vh4H^a@CvtH!ue`% zmbd?@{ZE`r#@8I{X0D|CV)cdUjHe~-X<75ME}1`dcy5<8WlOfN4*YER+VJ&>wH<@0 z?L#T|!E9}7wsu!)&+$~viF+2K*R{?Wi(Kn2Zrcu2=E~MKTzUHP)0x`tbZvKP-!tjj zXO@h&tW{{lR+O<;r>)huthJw6U9UUNIa1|4*N^}5>7PHH**BKnHXgh7re(i|8$O{qfc*|A{YoqSOhmtS_?r72fH0P)3z=L{^|jVI;zkMv>lg|@ZK z+|a}&DwGQ$Q2{zhJehWr#CnOwRq&MK>?$i}xHSqHpvg$`;^e$POc;#-Chbvk+sL?| z*b;$6wUSUG5t+gE4S5r@{!Ir z|4?WeLSPmn70y6Nsr~xW6V&uuV(bm_{AeCX10u*d0T#{=iAI_X(R^ldHZ&9cHHq=7 zI?#`Vxut9^T=O9&*?Q*|2yeA3WV*}nnq8wNhLIE=9*E~9TJQ>gwg4~(` zv*&Yl%RF$FkDz`#1X+TQ2qe^68H&y=fDLVS_>pZE83V;k>1Qv$7+;1B-#egh9gWn zAevaqq5+u$7Qs)sn1&-R$x5*GI3R;)mZnW~vFzigX@LSTixxR1>LPJs_XKco35`^d zd*fasS<{yT0r%}hj-pJw7nDchu*Ft+r?U1+_2ueJ<<4~F&eWd6>B_@Pk7m8K8E9)K4qU(YyRsXG9?*6Q=2J)=DDpS^xF6&r%VfAb(c;Ms4R9VMb*^#9oJad<4 ziv8(g|8n2W;+AY>{gv9wwVBHHbY=TmW$?WD3!|yAx1n#o_~Mm zjkZ+fpxu*igXVYxjC=}mH*wjH^x%>w|uqH;v*%B65#Dvv+IkIjoZh62>hgpw1Q8{;V* zZ^D*E-Xbw6Oxvst7jI!wxE4~Sz;<9t(Kl&IsWMf^TOoQ0g~)AaGI3J{`p-KU3W3yq zn6z5Z@lICnLvzI~d=YZmSx()kgoX;ugNrXdrRUw>cqX3x=g-8V33$W9IZ%rgfCezk&MlaGOX8eqnwfBy+|u%BR3&drpy6fj=q;_-+~l>*jv=L zfVG5~1UgXh7|=oKqJg(b*hkwF$b0>w;U&YU{F{^a8_Ii8-j`oqDNC(MwLGwN#iAj% zW#ucRdiYArchygH?^NeDK&Agvrrv|8Ze}vJ6s|GRm?6Q~*2Fuo=zA4zlJGPn(9M)$-t3 z?)HnteJ758dwh6g=;-+1v13P%1q@%-O7K=Q_-G6ZVtShCOOu-!jGb4orSt;)*i1*l zP?FC3VX>IOwwP`F>yIM=poHLwzg2n-Y_0hjGHbo67wr;k2m=`jv=_jRelLxicJvJF z2-_*PgMvpWAVsyXhXUFp3%e-TO#$)zfRzCihG~R-l-frDaTTGLg8dX6KoBPZqAXwu zl=y(AwHi1?EwM|!^z5HyZc5AwJ z>ssx$^Fv>lxlLi+`H^2WbzQP#s~fNEyS(p5`&TA@I(>Ee?byxgo@{X7#uGQbooYXF zX<*rR`AD{@^@oQ5kD9lk{~cZD2QJm8O9R=qAY#?&(iW&FN-LHQtvk5Zp6f%uJo57+ znVzHRo}+6$kEiw?OEr%opYPuvS+}!nzr8o8<4S9RgD{zm`>uzskEZ;6>iGW1K?ta* z=Bs6R)zIo_ z%DpFB-TsB%SX*+>VkJ$AwaE3=x&fKKjQ<{9|ErsZ+}zbZZqUQM7wFUD=C3>YS_iwh z56T=AHn6Z=hX)@7{Yd$+nBpILY=c3=hgG)0fZ@X?9mSiClpZiqJZPYJmu(1utlK(d zHGHHuA>|{h2`L{H(bJFIwxKS=N0r{8cEd;QCd5UH#3Ompb7oecoh7NeBnlPnIYqbV zmKo?Q7@-j5Bk{1R3C4(sq?nrKGc0VTrZK$It_6GvddjXsz)68u3fRMz-;hx2U*K}- zZx|O13#5iol{QMf9QOhzcoV8(fj7zm*g)20XtFIi!I^L0k)@b(2A=EjkO2LM$na8bs@Y3EB- zU0{4B26VJ)kP4_lax>;!Ff(XGs-_}94b6=40D5@}4p-=Z;8pia_L-1B7CECZdU??l zKp6Kc#^uG=?LUEivLDL|Msetc1*YCekkwtTO_lS+iSJvf-Tv=Li&rCFNI?Q|sZ^i= zA5=wdWq14g=U{}NQIh<_1OB#Ckyr$lHf-Uc;vl7b&ZtABH_}44e^fGacf?Oe!esoH zvna}Rm1^?Fq23hKu*g*o1LgQ7m#aZfPfhW!ZC!mNbyh48nFJNLKBH%r0<}+DJsFdX-`7YNN z&;5+LZ80s7JY%(ia>NKp%oe+ObGGN3#!plQqf3oguxmDF0wX7$ju6yuwzu* zB6pYJmizT4E@_;Kg(6v{MJD;rK0Fya<>v-1Jdehgj zvhAMD@BVkk2k(#7h=qd(o)f2(+aRH94=*>ipD z`r%Z~@GbYFw;O_)hMnn#o#!oo=*qfFGw!CeyXls@1(hthgl4oP8p#zxG%+s-(Vm!{ zosN$~zVpIKJPm8{nu->)*h61@kV)_1qyn{5yfQ&V$F8YDYOwnj_&m&V-!EG*pVbv2 zoCSRns=u&)T&;D%Am>&INofxRX^?ZP#JXUVa~D973r0D&Iu8q`?^}Qv%{i}#gh#2p z5cw&@g%UY3G#4BPS5P5Vz<~DL0IjpHnMELEU{2#g!M5;(P;VgxT!Hq$ZZvo_XONpB zW5tF`J2PlOHOA$#DKi4>tiG|S`rLCR#+$!p1Qv{~z#GQctawrYUr+g!x^ur6n^j@G zFq7Kgarz3VaD$`KTpZ4xO!Wf04Af)a2qi1LgdonS%n6~ak-U>s-X{UmIP6mWAVkuc zg?OHR6R_u&Q1!qENkhx{S`AV`eYIwS8FH|c{cJ+s1lq?m3elFI*IKLL6=0nP% zq0gr?ozl$Zt?03R8#E7vfjfoB^E^%D9e51Z7#&?A$sgMockqLz12=8b5K?WgSSaVafG3o%PF)q@8V_IP0^HvXrBNB{$!6Hm}&z z&TXGKo3jp2%2AuGZCX0`+Q>aK2d|gm%fml9v}Czut)w=*8Aol}QM+t>%kico<3Eu0 zAGql_Aa^QT!bB#p=r9@NHf8F&()C@bx^1h0>jS?$^z%cRo@dfM&!qM~OSp7g!ln1D zT-}yTZCARsiyB2E8ysq!=bTwr`^wnL;p?s&XEFz$N*{bGH8h4+p4Qc5Ynn1Oo#~p+ zRQ1+X`}JMF?EQIfX7ADT-lM7R$IwdAF>1wT2l{oFN^-h58VgU8-g-)Of0 zx-G=0-$q~QLVf$-^-{oox1jL_dF`kX!h4EV`-Y3x;n;xw9fM*&1dfHRCtwWWhyq6r z@d_J@xBF*h&v-c9!}S8YMKB5YXMh)eGnYWh$o8y5th7>=X&*@8!1nskrL!92`Ra!a zFA&;~$q4yb5aX7gVYkiDsM=$dArfV(Hw9TP8!3c=%mg(Gh@4s=&)7@T@5TRJ65|iT zbEELr7`dtwol4#J=3#cIF>(EaQu?2n{K86PPeux$!LROmybp5mo7tM@~#ii}^I8vnD`1jZ|_~S)l zJbd%rC+|3ffX3F>04D)T%;XB@G^L1t?shX85PI z!*|b-%dNz6uF5*@wO&xO4jc#cjQw*#UbUd#$GzsEe8Mi|D8L^S&IKr`!o5QFdR~{H zh0dpaBO2PZcv;ZC~NTWH(CIh25yqBoP90W_Y z^wZe^@Fg4{*vJk5MP%35Bv6Q42lx??$A~bD@dfM>(U_ueBZ~|9wD z1VY{cBcmMAEw`rLS_`$_RY*6q)@Ths2=75gXd?dvA4x%;l2tKI@X zA$KYH23<;~-J919NCFu;0VQ&pD3be36SeDIL#pTS+U_H%T_X_8M|J+Jf9q<=YD3Du zBUMkHI3DuEDRPm$$eZ#utra(?tj!WVf^O7{wvLP*|1YCQtXBMPys*}E@8}gNwW!Y- zS9rq@pnDnMl=ZC85wdr1KSTJAEzt(Jo?+EJA*1TD+xe)b#V>691dbAW^Ew!U1D_YX!w%R#fqDiwT zB{ga4<_;z!BR1}O!L?w}JXgJB$=@fYCfaX;~d=dU?eBA24M$3epPr-fNR{ZPg4=c2`Ub#0DTcO+qr7nz7BWTiEQaA z$dWd?ifr8Ks-+>IB^gYjHBTB5C2Yt4U9#dI;&cp5JPTbU^WsL@#_NxD7j=*UB}Q(Z z`;Ue*Iw64^0i7_3ANUODgIk3c5RFsCinO-%kag$mX`wf{Rm);Xea8AcE>DUEa401% z61ySI=l|w@`wEw;*nRcvO2Z}3m6|tduAcqfU1DvomRIQhbp{nh?ZUr7pdF6zZ;|lN zAIPQrfmC*1t61r~)NrNajgD&-zY~^F>A%h(rv3#7ahV1|hkK;AQMv!xlhQCw;W@kh6~-gXq2_<7SMpZ=D`_}z?d)p9a>H9&{==4QXQi=7Zq9Ifme1A% zY>bdZm$dg+pnzB$g4dSTxb%JMClQ6f77@J!u{89;sr!@wVi8jnu=3HwJW#+(l-B@~ zkT&_WZ4%9W{l|x&7~F^o2my!&=oZi~KjIRVFH%fxTUA<+o`Mml@cWd3dKf3gCfJK~ zN$La7ePo%eeJIubJDSEXP!SM8Ieb1c-j=ktW#!b3M9SN;<~_V*{j97aO_aMy(#P8^69r8U4Ha0ysJS-qd5Gw`=`rS`ljv2R?4NReShzuib55=j=B7@4m2b)yH+e6RX2&i2;Xi2F0@IrcT9(DuX%G+qO0gn*N z6v6Ke7oIp04N4;N0IF@glpZ6mGcRxR#+-Q`B`Oetdc?v!N>pRv)TaAO!kxBj(W+T1 zMGMxcw)^v;7p^x9I0U3C{G50HnAR9vj^8O!d~RNaJNBaWCF>bo0)SDv&|XVkd)@^r znK}7Vz`or3RY$>>v3ko3*Q*}r@r5EFh+}gx#m$ABJ(bfN%r%zzCrU@q;pOm+AQ@34 zsq3XPAh?^O6W}>53o%03fSAiBCqUDKeH%Pc`274J?FYHT$lXV$)vL!YN7lZ9_VyJ3_Is>qRd+4Y$QC#zQd94a+0jkxRk0IeH!m$eaF8o z7GdVcM~)sJA3AzsWB~pfJ;RdQspide`(vkPP=dLm`a4ef4}@ZgNqi+E8tw>1DZ9Z;LVNvny_jTRs}&i4Jn-j z!o74RXB=lsVOo&xvE=0Yjn&d3;pw1~e6*cOTG2rRIX--3@aPHBl3CR0HJ3%f68i3rAqNhTa!uZOH*W&Rlzvbvfr7 zc=#$)EmsE5VlQ=S@X5jc6UT>-j>z7{df^IcV$Rd3^$^9Mpn37gzB*Fda1M?K%0)N4 zxMRF}plLeFTzp0SEDjgRZ;Y(dI8AGo3=Wcw-mQ6?<9M5KI6Tgs#J5yvrHcl1R`M`r z?mETtlt4ehXiidm#HeG;<(ROKGh7JK)_@RhOyigkEs1s%z=c zr{22T{_KzaNaa}!us-17` zdvo6!Grho_*R$iEfzC2JxzehoBX9t!%oMk!i`%~7%(B~V7l2*hT41&MdSA-jo2_ok zHn*)l{Z=2#13vBppLfV&_+WGUV7cMLawp;+Hu{J3%wyM*e~^kW0aFOo zfiFBrw_eDnR_NDy&=TU`coiz8V1hyh83mCE<%QL(h3XsSa{i@-OgDVa`3YE2fEpDg zRP}Koe_W*(yq**--!QKsKQFJUXmjOxlQQ;GMsmc0O8GdDs{x7}+Vik$!Jy=UuW=i1 z;jPnF!or1A#f3^KrO8(qN~td3I18C3q(e?noEI>IDdR={;X-vP2c+h$0bBB=AuvLP z#e%Ow?@Kb4#8d%5Qc&d6x1dNnq!Ed^N?`XAB!?*&-BrP0yYTO>5K3I^hL{gSs&EXp@Usa<06n+syXD zBVeb@qFpTWPx^8M@lb(ih8_HXZ`CAF20meRW-=O{6pfR!GZDtvMI*HzFiU&YcTj-7 zO))cr(;QSqTy)Y8#p$4`@RyXqf{y{=G;lmlbjijn*?@$f;6DFs>PDe-mpJkNL^g0@ z7p&E)CSHV}lu^$7HaxewnIvNh#wIE(Z#JNzkS zb==GPLfcNICtwdJWt*2_(TK4a3)z);m0<`T4e=Uz1ChPL4i<3FjtCU4LuFQ|L*2ll zjB!I9Myf-jb+$#(t3TEKK3ViiX+H8V=~%*RJih0kZbu8cPgyjZ!-6#_p^vXFX;~3X?%wQj97I7TTq!b+EnL< z+TnGJrk6~w{jKzycg9lN=9auRn+mjPeL!ofoJATgjeVpb3bCtl%$~K#7^r@I$1|Ag!v^&NLjT5 zO2A#>tfFp0G~#PpA!Y**$67&6p@;|pz0s4*~kua^X#&%Gb_4*_= zU&h;>_O{>h2D9$+&pc)4`Am6Ry1Z?r>6RzB+Hf1pbpFEpvgZ#L&KrMY;7U4iFutSf zr;lEJ^gkU=yW7s&FCAXjyFBH0d`%f&YueYEYTJ9u*K@n)z>S*JNGRQRa;+zP$(d@| zovzqJn!IKy+luv;uj_VK@AZX`zn$KHVy)|mOU~sd(-pzbx_Z)Ghp#Un0EZvBFtQBZ z8C);pI`-UaB#;a1VXA81yWtzne-nH!xYql4YTvO`#pox_sQn2_?pRuiQ>VxahL+hDulLtVpQ ztKq{|6XJQ|fXwhr9PB_yI>#uPc?ufv3%Si}81Y+q&Id-+yWs+|B6+>xLaKE`5^jYu z?dh;WITUsWBcBd+IPb3msj3@6?kQ4LO<7)QAzh@QFv~9Z861^)=GCg|5c5)rwl-Y6 z{>KhNv2+rSM96DbjpUPEK&v>_u%Re!b0Q8bRb`|=wnjyiLJXS|ElSBkIzqGzt!eIC zbL?xedBPay+yY7sx!=OQRNfEty{cAlsv}oQiSd?1rxGu`?v$FoRwQqc}s969jG?Ym{ zwX2apa>Iq?51n($^-+~Sfhx(t^%ZJ9zqgV!d7mCUM}cZR%Jo&4r3W8SK;**&ndl%z zEX=n!t#wv-my-Vq0i@3yMge!Q)6+P&rP16lrOh77*Ns3q6MlmdSck}?RU@$I!?-s3 zsuKHZfbdJo#{?L$5ot3Z8=0AJ%mxvbcid|?iLg;wgw=xm-tm?#4P;xly!FzXFJ)Ty zrd#*^UF$xav4BiEc&9OtY21-++yS4`D=%MuIeX|><`94L5dV&M

)U4t-!(5 zR4l7zY-r0gY)dz6%cV4J&NS^zH|@-}b!OTQq}vW;>sqeFF2^!;+tPKKd{XM?KBvFr zymP&ZYu<`u&to^;{`Fd}t#`eV!x8j~&FPBGnF?q+cCNm#R?)jOd>g_xy6nB>X<6~y zhTn|sg6&fCvTmi}6L&jF+D(v_MdcZ1ZQ5CTiO z!g_{cVFaRS0$41;e6xkqluCk(8D)i6DfUMctRN8G{Tr0^(gzWKLK%qbOa5BFpja~n zjTCs4fXwLe-(f-ifcsqUGg&|1R%7b9bQX@$_1o`qh_CkqO_j^dcRBp5e@{24Gr3ku zSHi2?S0=C4-R0Sz0vw7WwL@b7y z=H-FQz3UdbvvOs%mqsrfS+~(0oUfXecdQszMpvwF_NJ@0ty4YF-r39U7E$bgzQp8P z4zF|gS(#jYF&*r`OY!v}*U&<$MYO&-_<7MzQ|X;j-?|CEXt3CKe(v1tx`pnnoV((Z z;oRc7jqdD9^A5Uma_Dg_{K3|#0_@c7uDit)!`F*2IDgCMmReKA{lh{cTB)jAr^jf) z?pk^-ZL7L#quXAesb!_9o&xHpBw5-_N=dd*|Z#9*}gpaW^vlLb)6FL*ov0I z=eI9So~yfS!u|S?j>CBB8b1eoH68?me{xb!%+@ymA^zE+6>F7zebVYMw{xs!eYnv@~wpbZC&??6_Jd}@y z#hHqpeSedkjup*J^u#5yA@C#}N3g;Cf0%t+Q~0lx$Tl2o(dI8?(b^+XWv}ol@?jl= zy&?d%)#*Ohn{-C#Idslnajsu+wqJ2Yzv4W<;vD~ttN43v`zPG?|HX}@xsku;y3<_u j9b46sFJr61%e%CD&DQ*i`8VbRHr+wp7aaRx^Ys4!&Zb;k literal 0 HcmV?d00001 diff --git a/src/claude_cli_auth/__pycache__/cli_interface.cpython-312.pyc b/src/claude_cli_auth/__pycache__/cli_interface.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eefe19bf673bb3dc6b3f51700ba610a5ed33f098 GIT binary patch literal 34179 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 Ct#*F^ literal 0 HcmV?d00001 diff --git a/src/claude_cli_auth/__pycache__/exceptions.cpython-312.pyc b/src/claude_cli_auth/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e1012c1b2962629aa5e2e365e055c3726e4f739 GIT binary patch literal 13861 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

?P+B7SH1AXhDV8{&_ZgsK z{ET*PVq@zc=@3=4GR~K(SFoap$tmZge~mJUJHViS+mTCi|sdtZuG+j zakwMbu`MHP&ukxgf8+z(dnex}%fy%Xz=whEweeFdw@dxXDdwm4k{ zAGdihyXly`>DcO~6SAXs(YNHsplTWx9l6@ZMc19~9XFoJbRB+sFmvXa%@dt7h4F$_)Z_|erb=N(wc$O|NUtNyf*mv{GH;=tNoM}CByW;4bj_z#7 zklZnp6E^3XJ90e(x%ObLdsnV&N3Nx_;O7GS*EmO@>SNB)QgzKysN-symL_gh_vUIE zuAhA6WJcJzTC?kBrCc+F?}s%_l(^i#a&;wkb0{Mmxm|PgpDSt$Tez-g`GUxEo|=ri z`A*aD`<-uJd~Yx_d^*!`X7TuM{f$eTZujiH?cbNH6EYRThn3AsC*JbkuH37{e_Pj| zt7*-(@3^yRZ*KF@hdsfSO+Sd|`uekdhvmM*df=|x)>`+G&(=|QueP$js=!rNR^9F6 zJk>c*Mb^_Qds?%ee%aHXYYt?ax5&*~a<#43pLyk(TwPnXu1~J(`>?rf=}NYJyWGBg zwRuOu$$7WjawvOeF?@lc}x%}0i zjNYvL@zLzgQF-TRX2)2;%-0?TN}4OH3LdVeeYsm%|7^|XTQ!?kz9!df{YA}Y6(N>= zt2Ki+w#hX+Z`TawYK7&oTeU&teNJIiBFt`Ddg@kn&&uJ<<|7~M%$^M0IvM(KaL144 z-b23^HT}P?Y5CtauD0oqg+WZ||0Ianyg1xBF7WSk^Ct!^@AM20Ao5=Ao)f!F z?|b+Y+imZA_aXdK+t?;#{A@dq$j^2;$6KvGJ2c`QZ?OK{?M24V8>~qBd8--WNyz^C z11_SR2a;xfozxjU%LrVgQtKYW%yb4$b*aBEJ^&_bFZ@)TTp`HYc!BAwlrzeTfAmr!t$8HaCqg|iN6YJ03)t?M^4YfLvtFwS&%o* z%`@@zffh|yMvk!BT3rFkS04j32}uw_6<4g%6S;NME>XJFybb5y`f`0f8nBthr!;+# zp+o!}`HdKw3>KIP|6c=eH3aaMI66SGV`j(i*CYjxE;yPC(`cGu-ODR0IPw-LBpP?&{S4Hjbg zpl?Fib&u3qKK-J422xyHnJ3|k1?9~AF}5Zq=W%#e_;2|st9`MibDwB`)K%nNxx zWfj>Aq#m@EchaFh%`K6yVXg>dCy9h$4N?6fyhYZPh?uXMWP2Sukte$GAg_O#{PezipZ)@=VFx&KhM{|UMOiB)3= z1)IaUH`maTZ3xN@!ED2@+%UY_FtT|3PRFK|!*a*|T+iSSW8aTub{<>pIi70_yx#h1 z>+BuyK+t)9{}A zQ`t^QBM{^ipDbN+7!O(vuOr2qNcT|6Hz7`+ zl&uTOb-~rT&5Q1wqdMzolHuFa)b{$|tAn}r&TRV*xqZint($VeE!p6HIk^Arotfa# z(ip5TEv|c<&FLnKM03W`v{6o>U7R7L17ok0p*b5rWhRdon}&CBuQlNHpAX{o&MxP}y!l;@$Ge1M z6LEY4e`{wkE7hqBQROK|7NV|tF=wSRWFZC0lgnp`$#5Ss6+2_Gw#yI(Yr9PP7j7Fw zv;NTte&bk@deO2F(S=)hgq!woFF%XFo%m~GD!(Pwf9AqmlKe4Ch>a+WsncW&&`-Gr zQtecl9e}bb8yM?&8O;tC?9?8#Gb_-Heq^M`c~zI9)6*dsf(*%0A)U*Zo%9@D#nu3a z)?zu|PA%`JLECecf3{cgE4Jce3vnjv*Wzc!xf@d3KIeomCsn8fHV>gwVGb0EH8a~roS=B@0m zMzM-|Y=JKtkFKg}?Z7Z#PS$HN!^#fVDNB+hV)hv67n`&+;|td*{oV)tGC}cLLjAQa z@Xzxv|99nUD8K7e>CYdh{oi1m`kLwE{Mq_(20f{LMb}g40xt11<<^3F$2cLJ3*(#} z_b1nh&5$l>A=$>B>Y=*2dwhvkzp7v32JQ5Gs{e@MDglwiaG+=RPmIdC2Zi(q+8Fu6qh{Cj-5U-JTi91xYi%Eq_%GG zqbR=a!Jt_r??8V~Z8@&o2hqA2!PN}~08_ABkjDyvatgOZN#03qQvEP=Uy85I;Vv6p zc22O?VWEgc*{>QTQeDbm)_GSXW+RjEZJJbENfJ^gfEuh^e=UM=-&jvYEHkzr@;8v^ z9ssipNY7FzOfMpFWe*}{OfzTFnSHUMA?-v$s&B(aI8dbCAgE#7ZQ7Kk@p^&#Jv8se zCGqw6cj7l{vfIXPZ5u0?+}=$ec5llyx4*vs)%{E%-!6A-zh^b~R9&;&t_a+7(Agyn z44IbE+ZAK%b=bCqZWU|sd04Lo8aC&_(Pi!9JQTCI2gY1OWiqYeo9Y?DL6JP&;$Egmk zXVW!Hwjv-`1pZiXqm4h_Yy1D%+@}e016kfb(#^fg?H}F8z1Qs=-EDqv;Lzwc^ZVPZ z2*1D2dBkP@sp-%WtNEX-R)kCTT-rU^o_h={cbz-WK}jlm2Kx2NG+$N7?=7;b`k2ap?Fe%bq8sY$T!c8Z=H`VHDDpf7U(x*Z9$2%RgJTq(K=qZnkoD_rtG-4-;WAEn zBSIuRiJ!(v2)!^}^wOCOuB$~^fQ~2)vxhW}iAs;+6*P@2*U*@wV9>4zu{PXFf(xs{ zH1w-W($lB_|0(Ebs(W5^29^os5)>>c%o16t8&EVaDd{+Mc7k3P@iJ~dDOSm^AT71I z4BNS%*A)+uEAih@3yPtSYi-Xs8WkCrk$W&lZXsPT2rfT<+q3!pIsfbza@DO&fd2O3 zZyjEm%k=G&+u^d({L;~!w<=TDD|>rc>`q)60uR~_U_FL}uzZpTL)vlqN zU%J(G=vPgfui0|djZ06gR(IWLZqGLFmYa9qcW-^#J3ZH6`n|kg(>G$u5LKVo@*%E`Ipsf;jyW z650PWYeE@f*?5|$;Ny_+2)oBBkdK|vS4st?NAfx?ls&!BOe#vVL{V^})W)e-HK^#w z?`VZU0;Cx!UVTqd2+W0($kjwMm(Ysky_$JMxq4VlE^;AA6_ds#_EMvXw2W%yx8`!B zh#%VG66a6_1X9I$s;)i$t;5XaZHL^l}-wG9_+<{Gl?cv*Qxm$A84e%>! z?^L~`Mzj5+GXA%XW*p5qe_;7+w)=pL|Na9R#{mUrPob}pJ8Wb+_y+#g{tLDl^(T2JO;_-pubD*`)HpZPIFF&m!Km^Q z{x&hgiZ|ScWzlX=C{F5%Kd~mWDpc|X=#=@u>ck3?hcm!uldIyhtlk7rB03q;0aqF4 z^9{EuN-C7|!8$%#QUo@4xo{~U5L;tm1SDW7J6E{)-VM(Z$tFZs}i*INV%K*Uk*#r_*_C$eInYm>jYfDNhl!g z2cirawApE>K#t9NiwaNd0~IR*h3&I_kjI%2A_Y-Cp-7Snf<5zu2N(ABzIbH5b@H&e9#*a>5{7rVCy!aA1wI2jDMlZ}Baj!g*(nkgeV>S8rdf z-kI_2yyIWP)ny$aGMY6wgzd@M6 zT@DEU55%5}x#HNmOJMMH)Tx|svDAUIAt6G%-QWG zc9#PQq%AWK*1WIuvWKdyD0e=LY8Oy`y?Qc%w6dZX9lUP1MRJvh?KG+|Q~h0m^VHp` zYsx~GsO!zv?U3ts+&HmXcX;vWFa347`nGF6$X$jn-=ORt%+)mK+6Hs=9k`NEu@zSm zDqIB)_XqxvAi?FuVQ$#O2hHPWaa=b(eq?-n92(q_Adio96a~hE7D`14ygHfvC+`Y{ zlwU**h4P+I=xcM~Y2^}1-X02x@k!i9Awh)w97o=A4&u0UnBv>$MHnX$`b(sC=dDxI z@o-Wi+r1Q_7ujy57`+3;w5qzl`hkZ1}>4MK$@r5pVRBF=(R+z@6wBGPjqnz z`mRI@A(MC|VsjELz#E(*Xda>jvXrw|2Lg%j0OH@|?wa;n9fjw4t`D~X+VMLQcb&t$ z)pe($VW~;3=qgw#23XfN7VIqO;F{XjSee2p6SrksuB$KC(UTiJmh0@zZP|9W@)?u0 z;Z8+$!Ab$tZ0TAaef3bm&Y}*kwsq;uD~}YMEb8K#+Y4?M^l(jq<-V0uD~E3G%xpd^ z2Og3ehYMbo=i|Vqx?gE8_*t}qMVHOXXO$etI>K&(daq`-Z#S1UBty!s9 zp{d7OyR=j7@X#8EXyGy5XKh{@U9Mi9TyA)Ee2qi2AT(JUmqyn(eAf1Qt^3#7Hd}p# z2|i%$fXh(B&CdVS`nKbP>UX@EZI8&CQ3)A^V|<>}`5UPLyxN7gY5mL~WFgDmL-M}Yr zXTNqBjpyz3V=)k>q^DT&EPl*!I(m-LTiynlin18dFydo0#OR8VDx*Kf-spr?vD1*5 z7r!;6%WFlq$NW^Nf?ni}DADdWr!3*c-Jb%|@m!cdto#29@XVAV literal 0 HcmV?d00001 diff --git a/src/claude_cli_auth/__pycache__/models.cpython-312.pyc b/src/claude_cli_auth/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39e65a075d3d59c29d394b3af2b3280e0d71d6d1 GIT binary patch literal 15928 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 bool: return True else: logger.warning( - "Claude auth command failed", - returncode=result.returncode, - stderr=result.stderr.strip() + f"Claude auth command failed - returncode: {result.returncode}, " + f"stderr: {result.stderr.strip()}" ) return False diff --git a/src/claude_cli_auth/cli_interface.py b/src/claude_cli_auth/cli_interface.py index fce2999..d116605 100644 --- a/src/claude_cli_auth/cli_interface.py +++ b/src/claude_cli_auth/cli_interface.py @@ -453,10 +453,8 @@ async def _handle_process_output( await stream_callback(update) except Exception as e: logger.warning( - "Stream callback failed", - error=str(e), - update_type=update.type, - process_id=process_id, + f"Stream callback failed - error: {str(e)}, " + f"update_type: {update.type}, process_id: {process_id}" ) # Check for final result @@ -466,10 +464,8 @@ async def _handle_process_output( except json.JSONDecodeError as e: parsing_errors.append(f"JSON error: {str(e)}") logger.debug( - "JSON parsing failed", - line=line[:200], - error=str(e), - process_id=process_id, + f"JSON parsing failed - line: {line[:200]}, " + f"error: {str(e)}, process_id: {process_id}" ) continue @@ -482,10 +478,8 @@ async def _handle_process_output( stderr_text = stderr.decode("utf-8", errors="replace") logger.error( - "Claude process failed", - return_code=return_code, - stderr=stderr_text[:500], - process_id=process_id, + f"Claude process failed - return_code: {return_code}, " + f"stderr: {stderr_text[:500]}, process_id: {process_id}" ) # Handle specific error types @@ -499,10 +493,8 @@ async def _handle_process_output( # Parse final result if not result_message: logger.error( - "No result message received", - message_count=len(message_buffer), - parsing_errors=len(parsing_errors), - process_id=process_id, + f"No result message received - message_count: {len(message_buffer)}, " + f"parsing_errors: {len(parsing_errors)}, process_id: {process_id}" ) raise ClaudeParsingError( @@ -525,12 +517,9 @@ async def _handle_process_output( ) logger.debug( - "Parsed Claude response", - content_length=len(response.content), - cost=response.cost, - tools_used=len(response.tools_used), - parsing_errors=len(parsing_errors), - process_id=process_id, + f"Parsed Claude response - content_length: {len(response.content)}, " + f"cost: {response.cost}, tools_used: {len(response.tools_used)}, " + f"parsing_errors: {len(parsing_errors)}, process_id: {process_id}" ) return response @@ -540,10 +529,8 @@ async def _handle_process_output( raise else: logger.error( - "Unexpected error in output handling", - error=str(e), - error_type=type(e).__name__, - process_id=process_id, + f"Unexpected error in output handling - error: {str(e)}, " + f"error_type: {type(e).__name__}, process_id: {process_id}" ) raise ClaudeParsingError( @@ -719,7 +706,14 @@ def _parse_tool_result_message(self, msg: Dict[str, Any]) -> StreamUpdate: def _parse_error_update(self, msg: Dict[str, Any]) -> StreamUpdate: """Parse error message for streaming.""" - error_message = msg.get("message", msg.get("error", str(msg))) + # Try to get error content + error_data = msg.get("message") or msg.get("error") or msg + + # If error_data is a dictionary, try to extract message field + if isinstance(error_data, dict): + error_message = error_data.get("message") or str(error_data) + else: + error_message = str(error_data) return StreamUpdate( type=StreamType.ERROR, diff --git a/tests/__pycache__/test_basic.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_basic.cpython-312-pytest-7.4.4.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca116d4a2f173b1a67fa4418655f22736a4b76ca GIT binary patch literal 22365 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 Umlj|8YTvMU_-N|Z(rET} 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_config_fallback.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_config_fallback.cpython-312-pytest-7.4.4.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bacec79e5be0760ad680cda664c216efc6cc6a4b GIT binary patch literal 18246 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_robustness.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_robustness.cpython-312-pytest-7.4.4.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d47a1db77c052bd25d02dcc86a898294208b3f5e GIT binary patch literal 5648 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 literal 0 HcmV?d00001 diff --git a/tests/test_basic.py b/tests/test_basic.py index e1c8f3e..3089bd8 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -4,7 +4,7 @@ from unittest.mock import Mock, patch from claude_cli_auth import ClaudeAuthManager, AuthConfig -from claude_cli_auth.exceptions import ClaudeAuthError +from claude_cli_auth.exceptions import ClaudeAuthError, ClaudeAuthManagerError def test_imports(): @@ -30,7 +30,8 @@ def test_auth_config(): """Test AuthConfig creation and defaults.""" config = AuthConfig() - assert config.timeout_seconds == 30 + # Default is 120 in models.py + assert config.timeout_seconds == 120 assert config.session_timeout_hours == 24 assert config.use_sdk is True assert config.enable_streaming is True @@ -47,14 +48,22 @@ def test_auth_config(): assert custom_config.use_sdk is False -def test_claude_auth_manager_init(): +@patch('claude_cli_auth.facade.AuthManager') +def test_claude_auth_manager_init(mock_auth_manager_cls): """Test ClaudeAuthManager initialization.""" - manager = ClaudeAuthManager() + # Mock AuthManager to be authenticated + mock_instance = mock_auth_manager_cls.return_value + mock_instance.is_authenticated.return_value = True - assert manager is not None - assert manager.auth_manager is not None - assert hasattr(manager, 'list_sessions') - assert hasattr(manager, 'get_session') + # Also patch SDK/CLI interfaces to avoid real initialization logic + with patch('claude_cli_auth.facade.SDKInterface'), \ + patch('claude_cli_auth.facade.CLIInterface'): + manager = ClaudeAuthManager() + + assert manager is not None + assert manager.auth_manager is not None + assert hasattr(manager, 'list_sessions') + assert hasattr(manager, 'get_session') @patch('claude_cli_auth.auth_manager.AuthManager.is_authenticated') @@ -62,8 +71,20 @@ def test_authentication_check(mock_is_authenticated): """Test authentication status check.""" mock_is_authenticated.return_value = True - manager = ClaudeAuthManager() - is_auth = manager.auth_manager.is_authenticated() + # When initializing ClaudeAuthManager, it calls is_authenticated internally + # We patch it, so it works. + + # Need to also patch the Interfaces if we want init to succeed fully without raising ClaudeAuthManagerError + # Or expect the error if we only care about auth check logic. + # But for this test, we are calling manager.auth_manager.is_authenticated() manually. + + # Let's mock AuthManager fully to isolate the test of is_authenticated call + # But ClaudeAuthManager creates its own AuthManager. + + # Simpler: just create AuthManager directly + from claude_cli_auth.auth_manager import AuthManager + auth = AuthManager() + is_auth = auth.is_authenticated() assert is_auth is True mock_is_authenticated.assert_called_once() @@ -79,7 +100,7 @@ def test_claude_response_model(): cost=0.01, duration_ms=1000, num_turns=1, - tools_used=["test_tool"] + tools_used=[{"name": "test_tool"}] # tools_used is list of dicts ) assert response.content == "Test response" @@ -87,15 +108,15 @@ def test_claude_response_model(): assert response.cost == 0.01 assert response.duration_ms == 1000 assert response.num_turns == 1 - assert response.tools_used == ["test_tool"] + assert response.tools_used == [{"name": "test_tool"}] def test_session_info_model(): """Test SessionInfo model.""" from claude_cli_auth.models import SessionInfo, SessionStatus - from datetime import datetime + import time - now = datetime.now() + now = time.time() session = SessionInfo( session_id="test-session", created_at=now, @@ -130,4 +151,4 @@ def test_exceptions_hierarchy(): # Test exception creation error = ClaudeAuthError("Test error", suggestions=["Try again"]) assert str(error) == "Test error" - assert error.suggestions == ["Try again"] \ No newline at end of file + assert error.suggestions == ["Try again"] diff --git a/tests/test_cli_parsing.py b/tests/test_cli_parsing.py new file mode 100644 index 0000000..aa5bbd3 --- /dev/null +++ b/tests/test_cli_parsing.py @@ -0,0 +1,176 @@ +"""Unit tests for CLI interface parsing using mock data.""" + +import asyncio +import json +import pytest +from unittest.mock import MagicMock, AsyncMock, patch + +from claude_cli_auth.cli_interface import CLIInterface, CLIResponse +from claude_cli_auth.models import StreamType, StreamUpdate, AuthConfig + +# Mock data based on provided patterns +MOCK_ASSISTANT_MSG = { + "type": "assistant", + "message": { + "content": [{"type": "text", "text": "Ahoj, jak ti mohu pomoci?"}], + "role": "assistant" + }, + "session_id": "uuid-session-123", + "id": "msg_123" +} + +MOCK_TOOL_USE_MSG = { + "type": "assistant", + "message": { + "content": [ + { + "type": "tool_use", + "name": "ReadFile", + "input": {"path": "main.py"}, + "id": "tool_call_xyz" + } + ], + "role": "assistant" + }, + "session_id": "uuid-session-123", + "id": "msg_124" +} + +MOCK_RESULT_MSG = { + "type": "result", + "result": "Obsah souboru main.py je...", + "cost_usd": 0.0015, + "duration_ms": 450, + "num_turns": 2, + "is_error": False, + "session_id": "uuid-session-123" +} + +MOCK_ERROR_MSG = { + "type": "error", + "error": { + "type": "overloaded_error", + "message": "Claude is currently overloaded" + }, + "session_id": "uuid-session-123" +} + +@pytest.fixture +def cli_interface(): + # Mock AuthManager to bypass authentication check + mock_auth = MagicMock() + mock_auth.is_authenticated.return_value = True + + interface = CLIInterface(auth_manager=mock_auth) + return interface + +@pytest.mark.asyncio +async def test_parse_assistant_message(cli_interface): + """Test parsing of standard assistant text message.""" + update = cli_interface._create_stream_update(MOCK_ASSISTANT_MSG) + + assert update is not None + assert update.type == StreamType.ASSISTANT + assert update.content == "Ahoj, jak ti mohu pomoci?" + assert update.session_id == "uuid-session-123" + assert update.metadata.get("message_id") == "msg_123" + +@pytest.mark.asyncio +async def test_parse_tool_use_message(cli_interface): + """Test parsing of tool use message.""" + update = cli_interface._create_stream_update(MOCK_TOOL_USE_MSG) + + assert update is not None + assert update.type == StreamType.ASSISTANT + assert update.tool_calls is not None + assert len(update.tool_calls) == 1 + + tool_call = update.tool_calls[0] + assert tool_call["name"] == "ReadFile" + assert tool_call["input"] == {"path": "main.py"} + assert tool_call["id"] == "tool_call_xyz" + +@pytest.mark.asyncio +async def test_parse_error_update(cli_interface): + """Test parsing of error message.""" + update = cli_interface._create_stream_update(MOCK_ERROR_MSG) + + assert update is not None + assert update.type == StreamType.ERROR + assert "Claude is currently overloaded" in update.content + assert update.error_info["message"] == "Claude is currently overloaded" + +@pytest.mark.asyncio +async def test_handle_process_output_success(cli_interface): + """Test full output handling with success sequence.""" + + # Create a mock process with stdout + mock_process = AsyncMock() + mock_process.wait.return_value = 0 + + # Setup mock stdout stream + # Sequence: Assistant msg -> Tool use -> Result + mock_lines = [ + json.dumps(MOCK_ASSISTANT_MSG), + json.dumps(MOCK_TOOL_USE_MSG), + json.dumps(MOCK_RESULT_MSG) + ] + + # Mock _read_stream_bounded to yield lines + async def mock_read_stream(stream): + for line in mock_lines: + yield line + + with patch.object(cli_interface, '_read_stream_bounded', side_effect=mock_read_stream): + # We need a callback to capture stream updates + updates = [] + async def callback(update): + updates.append(update) + + response = await cli_interface._handle_process_output( + process=mock_process, + stream_callback=callback, + process_id="test_proc" + ) + + # Verify response + assert isinstance(response, CLIResponse) + assert response.content == "Obsah souboru main.py je..." + assert response.session_id == "uuid-session-123" + assert response.cost == 0.0015 + assert response.is_error is False + + # Verify stream updates were captured + assert len(updates) == 2 # Assistant + Tool Use (Result is not a stream update usually, or handled internally) + assert updates[0].type == StreamType.ASSISTANT + assert updates[1].type == StreamType.ASSISTANT + assert updates[1].tool_calls[0]["name"] == "ReadFile" + + # Verify tools_used in response (extracted from messages) + # The logic in _parse_result_message reconstructs tools from buffered messages + assert len(response.tools_used) == 1 + assert response.tools_used[0]["name"] == "ReadFile" + +@pytest.mark.asyncio +async def test_handle_process_output_error(cli_interface): + """Test handling of process failure output.""" + mock_process = AsyncMock() + mock_process.wait.return_value = 1 + mock_process.stderr.read.return_value = b"Error: Usage limit reached reset at 10pm" + + # Mock _read_stream_bounded to yield empty or partial + async def mock_read_stream(stream): + yield "" + + with patch.object(cli_interface, '_read_stream_bounded', side_effect=mock_read_stream): + # Should raise ClaudeCLIError + from claude_cli_auth.exceptions import ClaudeCLIError + + with pytest.raises(ClaudeCLIError) as exc_info: + await cli_interface._handle_process_output( + process=mock_process, + stream_callback=None, + process_id="test_proc_err" + ) + + assert "usage limit reached" in str(exc_info.value).lower() diff --git a/tests/test_config_fallback.py b/tests/test_config_fallback.py new file mode 100644 index 0000000..b7e6f4e --- /dev/null +++ b/tests/test_config_fallback.py @@ -0,0 +1,190 @@ +"""Unit tests for Configuration and Fallback logic.""" + +import pytest +import shutil +from pathlib import Path +from unittest.mock import MagicMock, AsyncMock, patch + +from claude_cli_auth.models import AuthConfig +from claude_cli_auth.facade import ClaudeAuthManager, SDK_AVAILABLE +from claude_cli_auth.exceptions import ClaudeConfigError, ClaudeAuthError, ClaudeAuthManagerError + +# --- Configuration Tests --- + +def test_config_defaults(): + """Test default configuration values.""" + config = AuthConfig() + assert config.timeout_seconds == 120 + assert config.use_sdk is True + assert config.claude_config_dir == Path.home() / ".claude" + +def test_config_validation_valid(): + """Test validation of a valid configuration.""" + # We use temporary directory to ensure paths exist + config = AuthConfig( + claude_config_dir=Path("."), + working_directory=Path("."), + timeout_seconds=60 + ) + issues = config.validate() + assert len(issues) == 0 + +def test_config_validation_invalid_paths(): + """Test validation with non-existent paths.""" + config = AuthConfig( + claude_config_dir=Path("/non/existent/path/123"), + working_directory=Path("/non/existent/path/456") + ) + issues = config.validate() + assert len(issues) >= 2 + assert any("Claude config directory not found" in i for i in issues) + assert any("Working directory does not exist" in i for i in issues) + +def test_config_validation_invalid_values(): + """Test validation with invalid numeric values.""" + config = AuthConfig( + timeout_seconds=-1, + max_turns=0, + session_timeout_hours=-5.0 + ) + issues = config.validate() + assert len(issues) >= 3 + assert any("timeout_seconds must be positive" in i for i in issues) + assert any("max_turns must be positive" in i for i in issues) + assert any("session_timeout_hours must be positive" in i for i in issues) + +# --- Fallback Logic Tests --- + +@pytest.fixture +def mock_auth_manager_cls(): + """Mock AuthManager class to avoid real disk/auth checks.""" + with patch("claude_cli_auth.facade.AuthManager") as mock: + mock_instance = mock.return_value + # Mock successful initialization + mock_instance.is_authenticated.return_value = True + yield mock + +@pytest.fixture +def mock_sdk_interface(): + """Mock SDK Interface.""" + with patch("claude_cli_auth.facade.SDKInterface") as mock: + yield mock + +@pytest.fixture +def mock_cli_interface(): + """Mock CLI Interface.""" + with patch("claude_cli_auth.facade.CLIInterface") as mock: + yield mock + +@pytest.fixture +def enable_sdk_available(): + """Force SDK_AVAILABLE to True for tests.""" + with patch("claude_cli_auth.facade.SDK_AVAILABLE", True): + yield + +@pytest.mark.asyncio +async def test_manager_init_success(mock_auth_manager_cls): + """Test successful initialization of ClaudeAuthManager.""" + manager = ClaudeAuthManager() + assert manager.auth_manager is not None + +@pytest.mark.asyncio +async def test_fallback_sdk_to_cli( + enable_sdk_available, + mock_auth_manager_cls, + mock_sdk_interface, + mock_cli_interface +): + """Test automatic fallback from SDK to CLI when SDK fails.""" + + # Setup manager with fallback enabled + manager = ClaudeAuthManager(prefer_sdk=True, enable_fallback=True) + + # Mock SDK to raise an exception + sdk_instance = mock_sdk_interface.return_value + sdk_instance.execute = AsyncMock(side_effect=Exception("SDK Crash")) + + # Mock CLI to succeed + cli_instance = mock_cli_interface.return_value + cli_response = MagicMock() + # Mocking to_claude_response to return a plain object, NOT a coroutine + cli_response.to_claude_response.return_value = MagicMock( + cost=0.1, num_turns=1, tools_used=[], session_id="test_sess" + ) + cli_instance.execute = AsyncMock(return_value=cli_response) + + # Manually ensure both interfaces are "initialized" on the manager + manager.sdk_interface = sdk_instance + manager.cli_interface = cli_instance + + # Execute query + response = await manager.query("Test prompt") + + # Verifications + assert response is not None + # SDK should have been called + sdk_instance.execute.assert_called_once() + # CLI should have been called as fallback + cli_instance.execute.assert_called_once() + + # Stats should reflect failure and fallback + stats = manager.get_stats() + assert stats["sdk_failures"] == 1 + assert stats["fallback_successes"] == 1 + +@pytest.mark.asyncio +async def test_fallback_disabled( + enable_sdk_available, + mock_auth_manager_cls, + mock_sdk_interface, + mock_cli_interface +): + """Test that fallback does NOT occur when disabled.""" + + manager = ClaudeAuthManager(prefer_sdk=True, enable_fallback=False) + + # Mock SDK to raise an exception + sdk_instance = mock_sdk_interface.return_value + sdk_instance.execute = AsyncMock(side_effect=ClaudeAuthError("SDK Auth Fail")) + + # Mock CLI (should not be called) + cli_instance = mock_cli_interface.return_value + cli_instance.execute = AsyncMock() + + manager.sdk_interface = sdk_instance + manager.cli_interface = cli_instance + + # Expect failure + with pytest.raises(ClaudeAuthError): + await manager.query("Test prompt") + + # SDK called + sdk_instance.execute.assert_called_once() + # CLI NOT called + cli_instance.execute.assert_not_called() + +@pytest.mark.asyncio +async def test_all_methods_fail( + enable_sdk_available, + mock_auth_manager_cls, + mock_sdk_interface, + mock_cli_interface +): + """Test behavior when both SDK and CLI fail.""" + + manager = ClaudeAuthManager(prefer_sdk=True, enable_fallback=True) + + sdk_instance = mock_sdk_interface.return_value + sdk_instance.execute = AsyncMock(side_effect=Exception("SDK Error")) + + cli_instance = mock_cli_interface.return_value + cli_instance.execute = AsyncMock(side_effect=Exception("CLI Error")) + + manager.sdk_interface = sdk_instance + manager.cli_interface = cli_instance + + # Expect ClaudeAuthManagerError (wrapper for all methods failed) + with pytest.raises(ClaudeAuthManagerError) as exc_info: + await manager.query("Test prompt") + + assert "All Claude methods failed" in str(exc_info.value) diff --git a/tests/test_e2e_live.py b/tests/test_e2e_live.py new file mode 100644 index 0000000..5c7eddb --- /dev/null +++ b/tests/test_e2e_live.py @@ -0,0 +1,140 @@ +import pytest +import pytest_asyncio +import asyncio +from pathlib import Path +import tempfile +import os +from claude_cli_auth import ClaudeAuthManager, AuthConfig, ClaudeTimeoutError + +# Skip tests if not explicitly enabled to prevent accidental costs/api calls +# Run with: pytest tests/test_e2e_live.py --run-live +# OR env var RUN_LIVE_TESTS=1 +run_live = pytest.mark.skipif( + not os.getenv("RUN_LIVE_TESTS"), + reason="Nutné nastavit env proměnnou RUN_LIVE_TESTS=1 pro spuštění živých testů (stojí peníze/tokeny)" +) + +@pytest_asyncio.fixture +async def auth_manager(): + """Fixture pro inicializaci managera s krátkým timeoutem pro testy.""" + config = AuthConfig( + timeout_seconds=60, + use_sdk=False, # Vynutíme CLI pro jistotu, pokud nemáme SDK nainstalované + working_directory=Path(".") + ) + # We catch init error here to skip gracefully if not authenticated + try: + manager = ClaudeAuthManager(config=config) + except Exception as e: + if "not authenticated" in str(e).lower() or "no interfaces available" in str(e).lower(): + pytest.skip(f"Claude Auth initialization failed (not authenticated?): {e}") + raise e + + # Check if authenticated (redundant if init passed, but good for safety) + if not manager.auth_manager.is_authenticated(): + pytest.skip("Claude CLI není autentizováno. Spusťte 'claude auth login'.") + + yield manager + await manager.shutdown() + +@run_live +@pytest.mark.asyncio +async def test_01_basic_connectivity(auth_manager): + """Ověří základní spojení s Claude.""" + print("\n[TEST] Zkouším základní spojení...") + response = await auth_manager.query("Odpověz pouze slovem 'FUNGUJU'.") + + assert response.is_successful() + assert "FUNGUJU" in response.content + assert response.cost >= 0 + print(f"✅ Basic connectivity OK. Cost: ${response.cost}") + +@run_live +@pytest.mark.asyncio +async def test_02_session_memory(auth_manager): + """Ověří, že si Claude pamatuje kontext v rámci session.""" + session_id = f"test_mem_{os.urandom(4).hex()}" + secret_code = "BLUE_PINEAPPLE_99" + + # 1. Řekneme mu tajemství + await auth_manager.query( + f"Zapamatuj si tento kód: {secret_code}. Neodpovídej nic, jen si to ulož.", + session_id=session_id + ) + + # 2. Zeptáme se na něj + response = await auth_manager.query( + "Jaký byl ten kód, který jsem ti právě řekl?", + session_id=session_id, + continue_session=True + ) + + assert secret_code in response.content + + # Ověříme metadata session + session_info = auth_manager.get_session(session_id) + assert session_info is not None + assert session_info.total_turns >= 2 + print(f"✅ Session memory OK. Total turns: {session_info.total_turns}") + +@run_live +@pytest.mark.asyncio +async def test_03_file_context_analysis(auth_manager): + """Ověří, že Claude umí číst soubory.""" + with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as tmp: + tmp.write("def hello():\n return 'Hello World'") + tmp_path = Path(tmp.name) + + try: + # Prompt explicitly mentions file + prompt = f"Přečti soubor {tmp_path} a řekni mi název funkce v něm. Odpověz pouze názvem funkce." + + response = await auth_manager.query( + prompt, + working_directory=Path(tempfile.gettempdir()) # Working dir where file is + ) + assert "hello" in response.content + print("✅ File context reading OK.") + finally: + if os.path.exists(tmp_path): + os.unlink(tmp_path) + +@run_live +@pytest.mark.asyncio +async def test_04_streaming_callback(auth_manager): + """Ověří, že streaming vrací data po kouscích.""" + chunks = [] + + async def on_stream(update): + if update.content: + chunks.append(update.content) + + await auth_manager.query( + "Napiš čísla od 1 do 5 slovy (jedno na řádek).", + stream_callback=on_stream + ) + + assert len(chunks) > 0 + full_text = "".join(chunks) + assert "jedna" in full_text.lower() or "one" in full_text.lower() + print(f"✅ Streaming OK. Received {len(chunks)} chunks.") + +@run_live +@pytest.mark.asyncio +async def test_05_error_recovery(auth_manager): + """Ověří chování při timeoutu.""" + # Vytvoříme novou instanci s extrémně krátkým timeoutem + short_config = AuthConfig(timeout_seconds=0.1) # 100ms + + # Check auth before creating manager to avoid confusing errors + if not auth_manager.auth_manager.is_authenticated(): + pytest.skip("Claude CLI not authenticated") + + manager_short = ClaudeAuthManager(config=short_config) + + try: + with pytest.raises(ClaudeTimeoutError): + await manager_short.query("Napiš dlouhou báseň o vesmíru.") + print("✅ Timeout error handled correctly.") + finally: + await manager_short.shutdown() diff --git a/tests/test_robustness.py b/tests/test_robustness.py new file mode 100644 index 0000000..8bcee6d --- /dev/null +++ b/tests/test_robustness.py @@ -0,0 +1,100 @@ +"""Stress and robustness tests for Claude Auth Manager.""" + +import pytest +import asyncio +from unittest.mock import MagicMock, AsyncMock, patch + +from claude_cli_auth.facade import ClaudeAuthManager +from claude_cli_auth.models import AuthConfig, SessionStatus +from claude_cli_auth.exceptions import ClaudeTimeoutError + +@pytest.fixture +def mock_managers(): + """Mock underlying managers.""" + with patch("claude_cli_auth.facade.AuthManager") as am_mock, \ + patch("claude_cli_auth.facade.CLIInterface") as cli_mock, \ + patch("claude_cli_auth.facade.SDKInterface") as sdk_mock: + + am_instance = am_mock.return_value + am_instance.is_authenticated.return_value = True + + yield am_instance, cli_mock, sdk_mock + +@pytest.mark.asyncio +async def test_timeout_handling(mock_managers): + """Test behavior when query times out.""" + am_mock, cli_cls, sdk_cls = mock_managers + + # Setup manager with short timeout + config = AuthConfig(timeout_seconds=0.1) + manager = ClaudeAuthManager(config=config, prefer_sdk=False) + + # Mock CLI to hang (simulate timeout) + cli_instance = cli_cls.return_value + manager.cli_interface = cli_instance + + async def delayed_execute(*args, **kwargs): + await asyncio.sleep(0.5) + return MagicMock() + + cli_instance.execute = AsyncMock(side_effect=delayed_execute) + + # Expect timeout error + # Note: CLIInterface internally handles asyncio.wait_for, so it might raise ClaudeTimeoutError directly + # or asyncio.TimeoutError depending on implementation. + # ClaudeAuthManager catches exceptions. + # We need to ensure CLIInterface simulates the timeout behavior correctly OR + # check if ClaudeAuthManager wraps it. + # Looking at CLIInterface code, it uses asyncio.wait_for and raises ClaudeTimeoutError. + + # Let's mock execute to raise ClaudeTimeoutError directly to simulate what CLIInterface does + cli_instance.execute = AsyncMock(side_effect=ClaudeTimeoutError("Timeout")) + + with pytest.raises(ClaudeTimeoutError): + await manager.query("Test prompt") + +@pytest.mark.asyncio +async def test_invalid_session_recovery(mock_managers): + """Test handling of invalid or expired session.""" + am_mock, cli_cls, sdk_cls = mock_managers + + manager = ClaudeAuthManager(prefer_sdk=False) + cli_instance = cli_cls.return_value + manager.cli_interface = cli_instance + + # Mock AuthManager to return None for session + am_mock.get_session.return_value = None + + # When querying with non-existent session, it should probably create a new one or fail? + # ClaudeAuthManager._get_or_create_session calls auth_manager.get_session. + # If it returns None, it calls auth_manager.create_session. + + am_mock.create_session.return_value = MagicMock(session_id="new_session") + + # Execute + cli_response = MagicMock() + cli_response.to_claude_response.return_value = MagicMock( + cost=0.0, num_turns=0, tools_used=[], session_id="new_session" + ) + cli_instance.execute = AsyncMock(return_value=cli_response) + + response = await manager.query("Test", session_id="invalid_old_session") + + assert response is not None + # Should have tried to create a new session + am_mock.create_session.assert_called() + +@pytest.mark.asyncio +async def test_cleanup_sessions(mock_managers): + """Test session cleanup logic.""" + am_mock, _, _ = mock_managers + + manager = ClaudeAuthManager() + + # Mock cleanup return value + am_mock.cleanup_expired_sessions.return_value = 5 + + count = await manager.cleanup_sessions() + + assert count == 5 + am_mock.cleanup_expired_sessions.assert_called_once()